首页 > 解决方案 > 如何从 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 中的某一行获取值?

标签: c#asp.netgridview

解决方案


浏览完您的代码后,我注意到您的标记中没有添加任何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 列中有一个BoundFieldfor department_ID,因此您可以从那里获取它,如下所示:

GridView1.Rows[0].Cells[0].Text; 

这将为您提供位于索引为 0 的行内的索引为 0 的单元格中的文本。


推荐阅读