如何从 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 的行内的文本。