使用按钮从GridView和DB中删除记录

时间:2012-10-25 19:52:58

标签: c# c#-4.0 gridview

我有一个GridView,包含我数据库中的一些数据。

但是,当悬停删除链接时,它会链接到错误的ID。

我希望它使用数据库中的ID。

这个问题与this one非常相关 - 但它从未收到答案。

我的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();
        }
    }

getCommentsFromDB:

    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;
    }

2 个答案:

答案 0 :(得分:3)

有很多方法可以做到这一点。我倾向于使用ASP.NET Button并将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();
        }
}

答案 1 :(得分: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);

继续为您需要的每一栏