ASP.NET GridView 复选框选择

7

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

我有一个网格视图,在网格视图中有一个复选框,单击复选框后,我正在执行后台事件,并尝试仅更新数据库中的此特定行。

这是我的网格视图复选框代码。请参见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个回答

7

试试这个:

CheckBox chkBx = sender as CheckBox;

不需要遍历所有行。

我自己没有使用过GridView中的CheckBox。通常我会使用GridView的OnRowCommand事件,然后使用RowIndex或CommandArgument值来更新数据库。

考虑到CheckBox触发OnRowcommand可能会有些棘手,更好的解决方案可能是使用复选框的CheckChanged事件,并使用控件NamingContainer在服务器端导航到GridViewRow。类似这样:

GridViewRow row = chkBx.NamingContainer as GridViewRow;

我假设这里的CheckBox => Cell => Row关系,如果您在谷歌上搜索ASP.NET NamingContainer,您将得到更多具体信息。

谢谢您的回答。但是我需要从同一行获取其他值,那么我该如何获取特定GridView行的行ID,以便我可以获取记录的ID。 - Supremestar
我建议不要绑定复选框的OnCheckChanged事件,而是使用GridView的OnRowCommand事件,该行将在GridVieweCommandEventArgs中提供。 - hollystyles
HollyStyles,在Gridview中我没有选择命令字段,因此Gridview行命令没有触发。我的朋友,我该怎么办?请帮忙。 - Supremestar
做了一些编辑。你可以将selectedIndexChanged附加到CheckBox上,但当我写它时,我觉得这真的是一个解决方案的味道。 - hollystyles
1
你真的很棒,做得非常好!稍加修改后,它就像魔法一样运行了。GridViewRow 行 = chkBx.NamingContainer as GridViewRow;感谢你的帮助。我该如何将您的评论标记为答案呢?干杯 - Supremestar
@Supremester:没问题。接受答案也会接受所有的评论。我已编辑我的回答以匹配你的编辑。 - hollystyles

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;
    }
}

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接