我有一个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;
}
答案 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);
继续为您需要的每一栏