如何确定在动态创建的DataTable中单击了哪个按钮

时间:2015-01-17 11:47:23

标签: asp.net gridview

我正在创建绑定到Grid View的动态数据表。每行都填充了按钮。当我确定在行上单击了哪个按钮时,我想获取该行中单击按钮的单元格的当前值并修改她。帮助!

标记

<asp:GridView ID="GridView2" runat="server" 
    OnRowDataBound="GridView2_RowDataBound">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:Button ID="btnTest" runat="server" 
                    CommandName="odzemi" 
                    CssClass="button2" 
                    Font-Bold="True"
                    Text="-" 
                    Width="100px" 
                    OnClick="btnTest_Click" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

//以这种方式创建一行

         private void AddNewRecordRowToGrid()
             {         
             int counter;

            if (Request.Cookies["kasa"] == null)

            counter = 0;


        else
        {
            counter = int.Parse(Request.Cookies["kasa"].Value);

        }
        counter++;

        Response.Cookies["kasa"].Value = counter.ToString();
        Response.Cookies["kasa"].Expires = DateTime.Now.AddYears(2);

        if (ViewState["Markici"] != null)
        {
            DataTable dtCurrentTable = (DataTable)ViewState["Markici"];
            DataRow drCurrentRow = null;

            if (dtCurrentTable.Rows.Count > 0)
            {

                for (int i = 1; i <= dtCurrentTable.Rows.Count; i++)
                {


                    HttpCookie cookie = Request.Cookies["Democookie"];
                    drCurrentRow = dtCurrentTable.NewRow();

                    drCurrentRow["FirmaID"] = Request.Cookies["firma"].Value; 
                    drCurrentRow["Godina"] = Request.Cookies["godina"].Value;
                    drCurrentRow["KasaID"] = Request.Cookies["kasa"].Value;
                    drCurrentRow["MarkicaID"] = Request.Cookies["kasa"].Value; 
                    drCurrentRow["Datum"] = DateTime.Now;
                    drCurrentRow["Masa"] = Session["masa39"];
                    drCurrentRow["VrabotenID"] = Session["New"];
                    drCurrentRow["Artikal"] = Label3.Text;
                    drCurrentRow["Cena1"] = Label4.Text;
                  //this is where i need to make changes
                     drCurrentRow["Kolicina"] = Label5.text;
                    drCurrentRow["Smena"] = Session["smena1"];
                    drCurrentRow["VkIznos"] = Label6.Text;
                    drCurrentRow["VkDanok"] = Label8.Text;
                    drCurrentRow["SySDatum"] = DateTime.Now;
                    drCurrentRow["Vid"] = Label23.Text;
                    drCurrentRow["Edmera"] = Label10.Text;
                    drCurrentRow["ArtikalID"] = Label33.Text;
                }


                //Removing initial blank row  
                if (dtCurrentTable.Rows[0][0].ToString() == "")
                {
                    dtCurrentTable.Rows[0].Delete();
                    dtCurrentTable.AcceptChanges();

                }

                //Added New Record to the DataTable  
                dtCurrentTable.Rows.InsertAt(drCurrentRow,0);
                //storing DataTable to ViewState  
                ViewState["Markici"] = dtCurrentTable;

                //binding Gridview with New Row  
                GridView2.DataSource = dtCurrentTable;
                GridView2.DataBind();


            }
        }
    }

//在此按钮中我调用该方法

          protected void Button9_Click(object sender, EventArgs e)
           {     
          AddNewRecordRowToGrid();

           }

//           在这里,我确定了行的点击按钮,在这里                    dtCurrentTable.Rows [clickedIndex] [“Kolicina”] =“”我需要  得到每行不同的细胞值。

         protected void btnTest_Click(object sender, EventArgs e)
    {

        DataTable dtCurrentTable = (DataTable)ViewState["Markici"];
        var clickedRow = ((Button)sender).NamingContainer as GridViewRow;

        var clickedIndex = clickedRow.RowIndex;

       //so here i want to get current value of cell, and modify her            

            dtCurrentTable.Rows[clickedIndex]["Kolicina"] = " ";               

        GridView2.DataSource = dtCurrentTable;
        GridView2.DataBind();


    }

2 个答案:

答案 0 :(得分:1)

试试这个。

protected void btnTest_Click(object sender, EventArgs e)
{
    var clickedRow = ((Button)sender).NamingContainer as GridViewRow;
    var clickedIndex = clickedRow.RowIndex;
}

如果您的GridView 没有启用排序或分页,则可以从此clickedIndex获取DataTable的相应行。

dtCurrentTable.Rows[clickedIndex]["Kolicina"] = "StackOverflow";

答案 1 :(得分:0)

在RowDataBound事件中,EventArgument e应该包含绑定在其中的当前项的索引。代码e.Row.RowIndex将返回Grid中行的索引,不一定是应用分页时的数据源。有一个'DataItemIndex'属性,另一个索引可以根据你想要做的事情为你提供你想要的东西。

网格还公开了Rows集合,您可以使用foreach遍历每个集合,并以此方式访问。

注意,回发上的行只会基于通过viewstate回发的标记;网格对您的数据源一无所知(除非您在每次回发时重新绑定)。