C# 在GridView中将隐藏字段用作行索引(其数据源是DataTable)

C# 在GridView中将隐藏字段用作行索引(其数据源是DataTable),c#,asp.net,C#,Asp.net,我有一个GridView1声明为: <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" GridLines="None" DataKeyNames="Case_ID"> <Columns> <asp:TemplateField> <ItemTemplate><asp:CheckBox ID="cb" runat="

我有一个
GridView1
声明为:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" GridLines="None" DataKeyNames="Case_ID">
  <Columns>
      <asp:TemplateField>
           <ItemTemplate><asp:CheckBox ID="cb" runat="server" /></ItemTemplate>
      </asp:TemplateField>
      <asp:TemplateField  HeaderText="No.">
           <ItemTemplate><%# Container.DataItemIndex + 1 %></ItemTemplate>
      </asp:TemplateField>
      <asp:BoundField  HeaderText="Case Title"  DataField="caseTitle"/>
      <asp:BoundField  HeaderText="Age" DataField="age" />
      <asp:BoundField  HeaderText="Gender"  DataField="gender"/>
      <asp:BoundField  HeaderText="Treated By" DataField="owner"/>
      <asp:BoundField  HeaderText="Added Date"  DataField="sDate"/>
      <asp:BoundField  HeaderText=""  DataField="Case_ID" Visible="false"/>
  </Columns>
</asp:GridView>
我想使用
Case\u ID
作为
GridView
的索引,以便在
GridView
中选中记录的复选框时,可以从数据库中删除记录


对不起,如果我的问题不是那么清楚

我不知道问题到底出在哪里,希望你能帮我

以下是场景:

  • GridView
    显示数据库中的案例信息
  • 用户可以选中复选框,然后单击[删除]按钮,此操作将从数据库中删除记录
因此,我需要在GridView中有主键(
Case\u ID
),但我不需要它可见

当我在[删除]按钮中执行此代码时:

foreach (GridViewRow row in GridView1.Rows)
{
    CheckBox c = (CheckBox)row.FindControl("cb");

    if (c.Checked)
    {
        int rowIndex = GridView1.SelectedIndex;
        string id = GridView1.DataKeys[rowIndex].Value.ToString();
        ds.DeleteCommand = " delete from Cases where Case_ID=" + id + "";
        ds.Delete();
    } 
}
没有删除任何内容!我不知道为什么

GridView
DataDource
SqlDataSource
时,它工作,但对于
DataTable
则不是

我希望现在天气晴朗

编辑:
*当使用
断点时
我发现
c
总是
null
即使在检查一些记录时也是如此;因此,问题在于没有检测到
复选框中的更改,我该怎么做才能检测到它?*

您可以按如下方式使用数据键命令(删除命令):

protected void GridView1_RowCommand(object sender, System.Web.UI.WebControls.GridViewCommandEventArgs e)
{
    if (e.CommandName == "Delete") {
        int Case_ID = ((GridView)sender).DataKeys[e.CommandArgument].Values[0].ToString();
        // TODO, your delete routine
    }
}
您正在使用

int rowIndex = GridView1.SelectedIndex; 
在你的循环中。对于每一行,您将获得相同的
SelectedIndex
。您不应该从正在枚举的当前
中编制索引吗?此外,使用调试器单步执行代码,检查变量。这个问题可能会突然向你袭来。如果您正在使用事务,请确保它正在提交

您可以尝试以下方法:

foreach (GridViewRow row in GridView1.Rows)  
{  
    CheckBox c = (CheckBox)row.FindControl("cb");  

    if (c.Checked)  
    {  
        string id = row["Case_ID"].ToString();  
        ds.DeleteCommand = " delete from Cases where Case_ID=" + id + "";  
        ds.Delete();  
    }   
}

注意,这是未经测试的代码。您应该按照建议尝试使用ASP.NET提供的现成功能。

是的,我想使用Case\u ID作为GridView的索引,这样当我在GridView中选中某个记录的复选框时,我就可以从数据库中删除该记录了。所以,你想知道如何在复选框
oncheckchanged
或smth上获取行的
Case\u Id
吗?我编辑了这篇文章,请看一看,谢谢。很抱歉我没有得到它,你是什么意思?谢谢你的重播,但我需要使用[删除]按钮删除选中的记录。你有什么想法吗?使用我的示例和GV上的一个命令按钮来删除单个记录。它也不起作用,,此错误消息显示“非invocable成员”System.Web.UI.WebControl.GridView.DataKeys不能像方法一样使用。“它不起作用。”。。我发现这个复选框总是空的,这就是为什么它没有被删除,但是我怎样才能让它检测到这个复选框呢?
foreach (GridViewRow row in GridView1.Rows)  
{  
    CheckBox c = (CheckBox)row.FindControl("cb");  

    if (c.Checked)  
    {  
        string id = row["Case_ID"].ToString();  
        ds.DeleteCommand = " delete from Cases where Case_ID=" + id + "";  
        ds.Delete();  
    }   
}