使用按钮从GridView和数据库中删除记录

4
我有一个从我的数据库中获取一些数据的 GridView。
然而,当悬停在删除链接上时,它会链接到不正确的 ID。
我希望它使用数据库中的 ID。
这个问题与这个非常相关——但它从未得到答案。
我的GridView代码如下:
<asp:GridView ID="GridView1" runat="server" OnRowDeleting="GridView1_RowDeleting1" AutoGenerateColumns="false" DataKeyNames="id">
    <Columns>
      <asp:BoundField HeaderText="Name" DataField="name" />
      <asp:BoundField HeaderText="Email" DataField="email" />
      <asp:BoundField HeaderText="Comment" DataField="comment" />
      <asp:CommandField ShowDeleteButton="True"  />
    </Columns>
</asp:GridView>

如何使DeleteButton链接到正确的ID?

更新

将数据放入数据表中的页面加载代码:

    protected void Page_Load(object sender, EventArgs e)
    {
        DataTable commentsTable = null;
        commentsTable = new DataTable("Comments");
        using (SqlDataReader reader = studentManager.getCommentsFromDB())
        {
            commentsTable.Load(reader);
            GridView1.DataSource = commentsTable;
            GridView1.DataBind();
        }
    }

从数据库中获取评论:

    public SqlDataReader getCommentsFromDB()
    {
        SqlConnection conn = dal.connectDatabase();
        conn.Open();
        cmd = new SqlCommand(@"SELECT id, name, email, comment FROM GuestBook", conn);
        rdr = cmd.ExecuteReader();
        return rdr;
    }

你能展示一下你的SQL语句吗? - AntLaC
哪一部分?选择还是删除? - Frederik
两者都可以,选择一个设置数据键。 - AntLaC
已添加选择功能,删除功能尚未完成,因为我想先解决ID问题。 - Frederik
2个回答

3

有几种方法可以实现这个功能。我倾向于使用ASP.NET按钮,并将CommandName属性设置为"Delete"

<asp:Button ID="btnDelete" runat="server" CommandName="Delete" />

或者

<asp:ImageButton ID="ibtnDelete" runat="server" ImageUrl="~/Images/Delete.gif" CommandName="Delete" />

或者
<asp:CommandField ButtonType="Button" DeleteText="Delete" ShowDeleteButton="true" />

然后只需连接处理 OnRowDeleting 的事件即可。
protected void GridView1_RowDeleting1(object sender, GridViewDeleteEventArgs e) {
    // Get the id
    string id = GridView1.DataKeys[e.RowIndex].Value.ToString();

    // Create the delete query
    string sql = @"delete from GuestBook where id = @id";

    using (SqlConnection conn = dal.connectDatabase()) {

        cmd = new SqlCommand(sql, conn);
        cmd.Parameters.Add("@id", SqlDbType.Int);
        cmd.Parameters["@id"].Value = id;

        try {
            conn.Open();
            cmd.ExecuteScalar();
        }
        catch (Exception ex) {
            Console.WriteLine(ex.Message);
        }
    }

    // Refresh the GridView1
    Bind_GridView1();
}

...以及每次刷新GridView的方法。将GridView绑定放在自己的方法中,可以更加简洁,您可以从页面的任何位置调用该方法(这意味着您也可以从页面加载事件中调用它)。

public void Bind_GridView1() {
        DataTable commentsTable = null;
        commentsTable = new DataTable("Comments");
        using (SqlDataReader reader = studentManager.getCommentsFromDB())
        {
            commentsTable.Load(reader);
            GridView1.DataSource = commentsTable;
            GridView1.DataBind();
        }
}

谢谢 - 这解决了我所有的问题!现在,我如何使它在按下删除按钮后重新加载页面? - Frederik
修改了我的 SQL 代码。我对 SQL 有点生疏了。最好的方法是创建一个接口并使用它,而不是每次都深入细节。 - Jagd
重新加载页面?啊...你是说,如何使它重新加载gridview以便您可以看到最近的更改?简单,只需再次重新绑定gridview即可。创建一个负责gridview绑定的方法会更容易和清晰。我会再次完善我的回答。 - Jagd

0

尝试添加 <asp:BoundField DataField="id" ReadOnly="True" Visible="false" />

您可能还需要明确定义您正在使用的 DataTable 作为 DataSource

定义数据表

        DataTable dt = new DataTable();
        DataColumn col = new DataColumn()
        {
            ColumnName = "id"
        };
        dt.Columns.Add(col);
        col = new DataColumn()
        {
            ColumnName = "name"
        };
        dt.Columns.Add(col);

然后对于每个你需要的列继续进行操作


那没有成功。你能解释一下将datatable定义为数据源的部分吗?我在ASP.NET和C#方面还很新。 - Frederik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接