【问题标题】:Deleting records from GridView and DB using (Check-box and delete button)使用(复选框和删除按钮)从 GridView 和 DB 中删除记录
【发布时间】:2012-02-19 21:30:57
【问题描述】:

我有一个 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 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));
I want to use Case_ID as an index for the GridView, so I can delete a record from database when I check its check box in the GridView.

这里是场景:

GridView 显示来自数据库的案例信息 用户可以勾选复选框然后点击[删除]按钮,这个动作应该从数据库中删除记录;

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

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

我发现即使在检查某些记录时 c 也始终为空;所以问题是它没有检测到复选框中的变化我该怎么做才能检测到它?

【问题讨论】:

    标签: c# asp.net gridview delete-row


    【解决方案1】:

    删除按钮在哪里...尝试使用删除按钮的“参数”属性找到合适的复选框按钮。我通常将我希望删除的行的 ID 作为按钮的参数属性值。这就是为什么我永远不需要搜索复选框...(在客户端我使用复选框的客户端单击事件来更新删除按钮的参数属性)。

    关于安全性的另一个词:使用存储过程来避免安全问题(永远不要将 delete 语句 - 或任何 SQL 语句 - 像 C# 中的硬编码...)。

    编辑:

    也检查一下:

         GridViewRow.RowType==RowType.DataRow 
    

    你得到 null 因为当前行可能是一个标题行,或者类似的东西 - 并且复选框不是这种行的一部分。

    【讨论】:

    • 感谢重播,gridview后面出现delete按钮:&lt;asp:Button ID="Button1" runat="server" Text="Delete" onclick="Button1_Click" /&gt;不好意思不知道怎么用ID作为按钮的参数,可能不止选中一个复选框,是否可以分配多个 ID?
    • @Meensat 我编辑了我的答案,并为每一行进行了另一项检查。但是,我不得不说 - 你必须改进它 - 尝试在每一行上工作删除链接按钮,然后你就不必搜索必须删除的行......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多