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

2 回答 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();
        }
}
于 2012-10-25T20:21:35.623 回答
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);

并继续您需要的每一列

于 2012-10-25T20:12:39.397 回答