我有一个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>
这是我用作DataSource的DataTable
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显示数据库中的案例信息 用户可以勾选复选框,然后单击[删除]按钮,此操作应删除数据库中的记录;
当我在[删除]按钮中执行此代码时:
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也始终为空;所以问题是它没有检测到复选框中的更改我该怎么做以使其被检测到?
答案 0 :(得分:0)
删除按钮在哪里...尝试使用删除按钮的“参数”属性查找拟合复选框按钮。我通常将要删除的行的ID作为按钮的参数属性值。这就是为什么我永远不需要搜索复选框...(在客户端我使用复选框的客户端点击事件来更新删除按钮的参数属性)。
关于安全性的另一个词:使用存储过程来避免安全问题(永远不要将删除语句 - 或任何SQL语句 - 在C#中硬编码...)。
编辑:
同时检查:
GridViewRow.RowType==RowType.DataRow
你得到null,因为当前行可能是标题行,或类似的东西 - 并且复选框不是这种行的一部分。