c# - 如何从 SQL Server 填充的 Gridview 中的特定行获取值
问题描述
我正在创建一种通过每行添加一个复选框来使用 Gridview 删除多个帐户的方法。我通过TemplateField
在 Gridview 中添加一个来做到这一点。使用 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: '索引超出范围。
必须是非负数且小于集合的大小。
参数名称:索引'
我认为它与 Datakeys 有关,所以我继续使用 MessageBox 进行检查;果然,它的值为 0
string insert = GridView1.DataKeys.Count.ToString();
System.Windows.Forms.MessageBox.Show(insert);
到目前为止,我不知道如何纠正这个问题。有没有办法填充数据键?一般来说,有没有办法(或替代方式)在检查复选框时从 Gridview 中的某一行获取值?
解决方案
浏览完您的代码后,我注意到您的标记中没有添加任何DataKeyNames
内容,因此请DataKeyNames
在您的GridView
. 因此,您的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 知道这些是您将在后面的代码中获得的键。
更新
回答你的第二个问题:一般来说,有没有一种方法(或另一种方法)可以在选中复选框时从 Gridview 中的某一行获取值
是的,与您阅读复选框的方式相同,但在不设置 DataKeyNames 属性的情况下读取 ID 的方式您必须在 GridView 中有一个列,其中包含您要获取的 ID。我注意到,您的 GridView 列中有一个BoundField
for department_ID
,因此您可以从那里获取它,如下所示:
GridView1.Rows[0].Cells[0].Text;
这将为您提供位于索引为 0 的行内的索引为 0 的单元格中的文本。
推荐阅读
- .net-core - Azure AD OAuth 未经许可为受众生成令牌
- reactjs - 如何将包含 JSX 的字符串解析为 JSX 组件
- java - 在您看来,是因为我收到此错误的循环滴答声 (2) 非常低吗?BUKKIT 1.16.5(老板栏)
- google-apis-explorer - 方法:projects.androidApps.create 总是返回错误
- python - 计算字典中列表中单词的频率
- javascript - 如何在反应原生的onPress上重新启动计时器
- python - 在我的代码中分配函数调用的位置在哪里?为什么会出现错误?
- javascript - 基于状态项的过滤
- java - java.lang.NoSuchMethodError: 'java.lang.String org.springframework.data.relational.repository.query.RelationalEntityInformation.getTableName()'
- javascript - 在一条路线中将多个 mongo DB 查询的结果发送到我的视图