在GridView中使用隐藏字段作为行索引(其DataSource是DataTable)

时间:2012-02-05 21:09:55

标签: 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="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>

这是DataTable我用作DataSource

DataTable aTable = new DataTable();

aTable.Columns.Add("caseTitle", typeof(string));
aTable.Columns.Add("age", typeof(string));
aTable.Columns.Add("gender", typeof(string));
aTable.Columns.Add("owner", typeof(string));
aTable.Columns.Add("sDate", typeof(string));
aTable.Columns.Add("Case_ID", typeof(int));

我想使用Case_ID作为GridView的索引,因此当我选中GridView中的复选框时,我可以从数据库中删除记录。


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

我不知道问题究竟在哪里,我希望你能帮助我。

这是场景:

  • GridView显示数据库中的案例信息
  • 用户可以勾选复选框,然后单击[删除]按钮,此操作应删除数据库中的记录;

因此我需要在GridView中使用主键(Case_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();
    } 
}

没有删除!我不知道为什么!

DataDource的{​​{1}}为GridView时,它正在工作,但SqlDataSource却不是。{/ p>

我希望现在明白。

修改 的 *使用DataTable时,即使我正在查看某些记录,我发现breakpoints始终是c;所以问题是它没有检测到null我可以做些什么来改变它? *

2 个答案:

答案 0 :(得分:0)

您可以在RowCommand(删除命令)上使用DataKey,如下所示:

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

答案 1 :(得分:0)

您正在使用

int rowIndex = GridView1.SelectedIndex; 
你的循环中的

。对于每一行,您将获得相同的SelectedIndex。您是否应该从当前列举的row索引?此外,使用调试器逐步执行代码,检查变量。问题可能会突然发生在你​​身上。如果您使用的是交易,请确保它正在提交。

您可以尝试以下方式:

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提供的pistipanko建议的内容。