asp.net gridview复选框选择

时间:2009-08-27 12:54:05

标签: asp.net .net gridview checkbox

需要一些帮助来解决这个问题。

我有一个gridview,在gridview中我有一个复选框,单击复选框后,我正在进行回发事件,并尝试仅在数据库上更新此特定行。

这是我的gridview复选框代码。看看OnCheckedChanged。

<asp:TemplateField HeaderText="Sample">
  <ItemTemplate>
     <asp:CheckBox runat="server" 
                   ID="chkSample" 
                   Checked='<%# Bind("Sample") %>' 
                   OnCheckedChanged="UpdateSupplyLed" 
                   AutoPostBack="True">
    </asp:CheckBox> 
  </ItemTemplate>
</asp:TemplateField>

代码:

protected void UpdateSupplyLed(object sender, EventArgs e)
{
    foreach (GridViewRow di in SamplingGridView.Rows)    
    {        
        CheckBox chkBx = (CheckBox)di.FindControl("chkSample");
        if (chkBx != null && chkBx.Checked)
        {
            //update database logic here.
        }
    }
}

上面的代码工作正常,但它给我的所有复选框都被检查,而不管我刚检查的那个。我不想要所有这些。

如何获得刚刚检查过的唯一一行值。某些行可能已经被检查过,因为这些记录的状态为true,我不想更新这些记录。

我想我的问题是对的!

更新:答案是:

protected void UpdateSupplyLed(object sender, EventArgs e)
{
    CheckBox chkSampleStatus = sender as CheckBox;        
    bool sample = chkSampleStatus.Checked;            
    GridViewRow row = chkSampleStatus.NamingContainer as GridViewRow;        
    TextBox txtId = row.FindControl("Id") as TextBox;            
    int id = Int32.Parse(txtId.Text);
}

2 个答案:

答案 0 :(得分:7)

试试这个:

CheckBox chkBx = sender as CheckBox;

而不是迭代所有行。

我自己没有以这种方式在GridView中使用CheckBox。通常我会使用GridView的OnRowCommand事件,并使用RowIndex或CommandArgument值来更新数据库。

考虑它OnRowcommand对于CheckBox来说可能很棘手,更好的解决方案可能是坚持使用复选框的CheckChanged事件并使用控件NamingContainer导航到GridViewRow服务器端。类似的东西:

GridViewRow row = chkBx.NamingContainer as GridViewRow;

我假设去了CheckBox =&gt; Cell =&gt;如果您使用Google ASP.NET NamingContainer,您将获得更多细节。

答案 1 :(得分:0)

如果上面没有完全正常工作,请尝试这个

DataTable dtGetStTable = (DataTable)ViewState["dtNewStudents"];

//Looping throgh Grid and deleting row after finding the checked row
for (int i = dtGetStTable.Rows.Count - 1; i > -1; i--)
{
GridViewRow row = GridView1.Rows[i];
bool isChecked = ((CheckBox)row.FindControl("CheckBox1")).Checked;

if (isChecked)
{
    try
    {
        string RollNo = dtGetStTable.Rows[i]["RollNo"].ToString();
        string Class = dtGetStTable.Rows[i]["Class"].ToString();
        string Division = dtGetStTable.Rows[i]["Division"].ToString();
        //Deleting the Reocrd from DataBase
        TotalRecordDeleted += objSRE.DeleteTheSelectedRecord(RollNo, Class, Division);

        dtGetStTable.Rows[i].Delete();
        dtGetStTable.AcceptChanges();
    }
    catch (Exception ex)
    {

        //throw;
    }
}

}