【发布时间】:2020-02-06 00:09:09
【问题描述】:
我正在创建一种通过每行添加一个复选框来使用 Gridview 删除多个帐户的方法。我通过在 Gridview 中添加 TemplateField 来做到这一点。使用 Gridview 的智能选项卡,然后我放置了一个 ID 为 DeleteSelector 的复选框
我的 ASP.NET 标记是这样的:
<asp:GridView ID="tbl_departments" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="department_ID" HeaderText="department_ID" />
<asp:BoundField DataField="department_Name" HeaderText="department_Name" />
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="DeleteSelector" runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Page_Load 处填充了数据:
protected void Page_Load(object sender, EventArgs e)
{
string query = "SELECT * FROM department_Information;";
tbl_departments.DataSource = SQL_Connect.GridFill(query);
tbl_departments.DataBind();
}
我的代码是这样的:
protected void btn_deleteSelected_Click(object sender, EventArgs e)
{
List<string> Fetch_ID = new List<string>();
string connection_String = "Data Source = Lap; Initial Catalog = Database; User ID = ***; Password = ***";
SqlConnection Connection = new SqlConnection(connection_String);
foreach (GridViewRow row in GridView1.Rows)
{
CheckBox CheckBoxControl = (CheckBox)row.FindControl("DeleteSelector");
if (CheckBoxControl != null && CheckBoxControl.Checked)
{
var dept_ID = (GridView1.DataKeys[row.RowIndex].Value);
Fetch_ID.Add((dept_ID).ToString());
}
}
string[] Process_ID = Fetch_ID.ToArray();
for (int i = 0; i < Process_ID.Length; i++)
{
Connection.Open();
string query = "DELETE FROM department_Information WHERE department_ID ='" + Process_ID[i] + "';";
SqlCommand cmd = new SqlCommand(query, Connection);
cmd.ExecuteNonQuery();
Connection.Close();
}
}
我无法继续检查我的 DELETE 方法是否正确,因为在 C# 到达该点之前,它在这一行抛出异常...
var dept_ID = (GridView1.DataKeys[row.RowIndex].Value);
例外是...
System.ArgumentOutOfRangeException: '索引超出范围。
必须为非负数且小于集合的大小。
参数名称:index'
我认为这与数据键有关,因此我继续使用 MessageBox 进行检查;果然,它的值为0
string insert = GridView1.DataKeys.Count.ToString();
System.Windows.Forms.MessageBox.Show(insert);
到目前为止,我不知道如何纠正这个问题。有没有办法填充数据键?一般来说,有没有办法(或替代方式)在检查复选框时从 Gridview 中的某一行获取值?
【问题讨论】: