如何从 SQL 服务器填充的 Gridview 中的特定行获取值
How to get value from a certain row in a Gridview that was filled by SQL Server
我正在创建一种通过在每行添加一个复选框来使用 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 was out of range.
Must be non-negative and less than the size of the collection.
Parameter name: index'
我认为它与数据键有关,所以我继续使用 MessageBox 进行检查;果然,它的值为 0
string insert = GridView1.DataKeys.Count.ToString();
System.Windows.Forms.MessageBox.Show(insert);
至此,我不知道如何纠正这个问题。有没有办法填充数据键?一般来说,是否有一种方法(或替代方法)可以在选中 Checkbox 时从 Gridview 中的特定行获取值?
在查看您的代码后,我注意到您没有添加任何 DataKeyNames
,因此请在您的 GridView
中添加一个 DataKeyNames
属性。因此,您的 GridView
标记应如下所示:
<asp:GridView ID="tbl_departments" runat="server" AutoGenerateColumns="False" DataKeyNames="department_ID">
<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>
注意我已经添加了属性 DataKeyNames="department_ID"
这将让 GridView 知道这些是您将在后面的代码中获得的键。
更新
回答你的第二个问题:一般来说,有没有一种方法(或替代方法)可以在选中 Checkbox 时从 Gridview 中的特定行获取值
是的,与您读取复选框的方式相同,但在不设置 DataKeyNames 属性的情况下读取 ID 的方式必须在 GridView 中有一列,其中包含您要获取的 ID。
我注意到,您的 GridView 列中有一个 BoundField
for department_ID
,因此您可以从那里获取它,如下所示:
GridView1.Rows[0].Cells[0].Text;
这将为您提供索引为 0 的单元格中位于索引为 0 的行内的文本。
我正在创建一种通过在每行添加一个复选框来使用 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 was out of range.
Must be non-negative and less than the size of the collection.
Parameter name: index'
我认为它与数据键有关,所以我继续使用 MessageBox 进行检查;果然,它的值为 0
string insert = GridView1.DataKeys.Count.ToString();
System.Windows.Forms.MessageBox.Show(insert);
至此,我不知道如何纠正这个问题。有没有办法填充数据键?一般来说,是否有一种方法(或替代方法)可以在选中 Checkbox 时从 Gridview 中的特定行获取值?
在查看您的代码后,我注意到您没有添加任何 DataKeyNames
,因此请在您的 GridView
中添加一个 DataKeyNames
属性。因此,您的 GridView
标记应如下所示:
<asp:GridView ID="tbl_departments" runat="server" AutoGenerateColumns="False" DataKeyNames="department_ID">
<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>
注意我已经添加了属性 DataKeyNames="department_ID"
这将让 GridView 知道这些是您将在后面的代码中获得的键。
更新
回答你的第二个问题:一般来说,有没有一种方法(或替代方法)可以在选中 Checkbox 时从 Gridview 中的特定行获取值
是的,与您读取复选框的方式相同,但在不设置 DataKeyNames 属性的情况下读取 ID 的方式必须在 GridView 中有一列,其中包含您要获取的 ID。
我注意到,您的 GridView 列中有一个 BoundField
for department_ID
,因此您可以从那里获取它,如下所示:
GridView1.Rows[0].Cells[0].Text;
这将为您提供索引为 0 的单元格中位于索引为 0 的行内的文本。