asp.Netgridviewでクリックセルイベントを追加

15225 ワード

実装機能:表のセル(最初の列、最後の列、最後の行ではなく0)をクリックして、行の最初のセルの内容と列名に基づいて詳細を問合せ、メッセージ・ボックスに表示します.
コードに追加
 protected override void Render(HtmlTextWriter writer)

    {

foreach (GridViewRow r in GridViewTzx.Rows)

        {

            if (r.RowType == DataControlRowType.DataRow)

            {

                for (int columnIndex = 1; columnIndex < r.Cells.Count; columnIndex++)//(int columnIndex = _firstEditCellIndex; columnIndex < r.Cells.Count; columnIndex++)

                {

                    Page.ClientScript.RegisterForEventValidation(r.UniqueID + "$ctl00", columnIndex.ToString());

                }

            }

        }

        base.Render(writer);

    }
    protected void GridViewTzx_RowDataBound(object sender, GridViewRowEventArgs e)

    {



        if (e.Row.RowType == DataControlRowType.DataRow)

        {

            //           LinkButton  

            LinkButton _singleClickButton = (LinkButton)e.Row.Cells[7].Controls[0];

            //        ,           ID             JavaScript   

            string _jsSingle = ClientScript.GetPostBackClientHyperlink(_singleClickButton, "");



            //                

            for (int columnIndex = 1; columnIndex < e.Row.Cells.Count-2; columnIndex++)//int columnIndex = _firstEditCellIndex; columnIndex < e.Row.Cells.Count; columnIndex++)

            {

                //            

                string js = _jsSingle.Insert(_jsSingle.Length - 2, columnIndex.ToString());

                //       onclick  

                e.Row.Cells[columnIndex].Attributes["onclick"] = js;

                //                

                e.Row.Cells[columnIndex].Attributes["style"] += "cursor:pointer;cursor:hand;";

            }

        }

    }
    protected void GridViewTzx_RowCommand(object sender, GridViewCommandEventArgs e)

    {

        string sXianghaos = "";

        int _rowIndex = int.Parse(e.CommandArgument.ToString());

        int _columnIndex = int.Parse(Request.Form["__EVENTARGUMENT"]);

        if (GridViewTzx.Rows[_rowIndex].Cells[0].Text != "  " && GridViewTzx.Rows[_rowIndex].Cells[_columnIndex].Text != "0" && _columnIndex < 6 && _columnIndex > 0)

        {

            string sGk = GridViewTzx.Columns[_columnIndex].HeaderText;

            string sXx = GridViewTzx.Rows[_rowIndex].Cells[0].Text;

            string sSubCmd = "id in (select max(id) as id from jzx_active group by xianghao) and XIANGHAO in (select boxno from boxnumber where boxtypeid = (select id from boxtype where type ='"+sXx+"') )";

            string sCmd = "";

            sCmd = "select xianghao from jzx_active where  (QYG like'" + sGk + "%' or MDG like'" + sGk + "%')  and " + sSubCmd ;

            if (sGk=="  ")

            {

                sCmd = "SELECT xianghao from jzx_active where ZHUANGTAI='" + sGk + "'  and " + sSubCmd;

            }





            MySqlDataReader reader = null;



            mySqlMod newMySqlMod = new mySqlMod();

            newMySqlMod.RunSQL(sCmd, out reader);

            

                if (reader.HasRows)

                {

                    while (reader.Read())

                    {

                        sXianghaos += reader[0].ToString();

                        sXianghaos += ",";

                    }

                    sXianghaos = sXianghaos.TrimEnd(',');

                    CommData.MessageBoxAsyncPostBack(this, GetType(), sXianghaos);

                }

                reader.Close();

            

        }

    }

 
 
参考資料:原文http://www.codeproject.com/Articles/18136/Edit-Individual-GridView-Cells-in-ASP-NET翻訳:webabcd
GridViewには、「SingleClick」というGridViewの最初の列にある非表示asp:ButtonFieldコントロールがあります.GridViewのデータ行にクリックイベントを追加します.
<Columns>

    <asp:ButtonField Text="SingleClick" CommandName="SingleClick"

                        Visible="False" />

</Columns>

RowDataBoundイベント内で各データ行の各セルにループしてクリックイベントを追加します.データ行のセルのインデックスをイベントパラメータとして使用すると、セルがイベントをクリックすると、どのセルがクリックされたのかがわかります.
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)

    {

        if (e.Row.RowType == DataControlRowType.DataRow)

        {

            //           LinkButton  

            LinkButton _singleClickButton = (LinkButton)e.Row.Cells[0].Controls[0];

            //        ,           ID             JavaScript   

            string _jsSingle = ClientScript.GetPostBackClientHyperlink(_singleClickButton, "");



            //                

            for (int columnIndex = _firstEditCellIndex; columnIndex < e.Row.Cells.Count; columnIndex++)

            {

                //            

                string js = _jsSingle.Insert(_jsSingle.Length - 2, columnIndex.ToString());

                //       onclick  

                e.Row.Cells[columnIndex].Attributes["onclick"] = js;

                //                

                e.Row.Cells[columnIndex].Attributes["style"] += "cursor:pointer;cursor:hand;"; 

            }     

        }

    }

コマンドパラメータとイベントパラメータをRowCommandイベント内で読み出します.選択した行と列のインデックスを示します.
  int _rowIndex = int.Parse(e.CommandArgument.ToString());      

    int _columnIndex = int.Parse(Request.Form["__EVENTARGUMENT"]);

検証のために、RowDataBoundで作成されたカスタムイベントを登録するには、ページに登録する必要があります.Renderメソッドを書き換えることでClientScriptManagementを呼び出す.RegisterForEventValidation.GridView.UniqueIDは行の一意IDを返し、ボタンの一意IDは行の一意IDに「$ct 100」を付加して生成される.
protected override void Render(HtmlTextWriter writer)

    {

        foreach (GridViewRow r in GridView1.Rows)

        {

            if (r.RowType == DataControlRowType.DataRow)

            {

                for (int columnIndex = _firstEditCellIndex; columnIndex < r.Cells.Count; columnIndex++)

                {

                    Page.ClientScript.RegisterForEventValidation(r.UniqueID + "$ctl00", columnIndex.ToString());

                }

            }

        }

      

        base.Render(writer);

    }

これにより、無効なコールバックパラメータまたはコールバックパラメータのエラーが防止されます.