gridview 删除问题。无法从 gridview 删除按钮删除 SQL 记录
gridview deletion issue. Can't delete a SQL record from the gridview delete button
尽管我试图了解 gridview 的删除方法,但我仍然不知道如何删除一行。我正在使用相同的 gridview 来显示 4 SQL tables。根据选择的 table,我进入 swich 案例以更改 SQLDataSource 的 SELECT 和 DELETE 命令。我不确定这是否是最佳做法,但 SELECT 部分有效。
我需要一些帮助的是删除部分。
- 关于如何实现我的目标,我的思维过程是否正确?
- 我必须有 OnRowDeleting="gv1_RowDeleting" 否则它给了我一个
错误。这是强制性的吗?
- 我的代码为什么不起作用?
.ASPX:
<form id="form1" runat="server">
<div class="listTitle"><% Response.Write(strListTitle); %>
<asp:GridView ID="gv1"
runat="server"
DataKeyNames="id"
CellPadding="2"
AutoGenerateDeleteButton="True"
OnRowDeleting="gv1_RowDeleting"
OnRowDeleted="gv1_deleteItem">
</asp:GridView>
</div>
</form>
</div> <!-- close middle -->
<div id="footer">
<asp:SqlDataSource ID="DS" runat="server" ConnectionString="<%$ ConnectionStrings:conn %>">
<DeleteParameters> <asp:Parameter Name="id"/> </DeleteParameters>
</asp:SqlDataSource>
</div>
.CS 文件:
switch (strType)
{
case "servers":
DS.SelectCommand = "SELECT * FROM tbServers";
DS.DeleteCommand = "DELETE FROM tbServers WHERE id = @id";
strListTitle = "Server List";
break;
case "systems":
DS.SelectCommand = "SELECT * FROM tbSystems";
DS.DeleteCommand = "DELETE FROM tbSystems WHERE id = @id";
strListTitle = "System List";
break;
case "itOwners":
DS.SelectCommand = "SELECT * FROM tbITowners";
DS.DeleteCommand = "DELETE FROM tbITowners WHERE id = @id";
strListTitle = "IT Owner List";
break;
case "systemOwners":
DS.SelectCommand = "SELECT tbSystemOwners.id, tbITowners.owner, tbSystems.Systems FROM tbITowners INNER JOIN tbSystemOwners ON tbITowners.id = tbSystemOwners.idITowners INNER JOIN tbSystems ON tbSystemOwners.idSytems = tbSystems.id";
DS.DeleteCommand = "DELETE FROM tbSystemOwners WHERE id = @id";
strListTitle = "System Owner List";
break;
default:
break;
}
gv1.DataSource = DS;
gv1.DataBind();
}
protected void gv1_deleteItem(object sender, GridViewDeletedEventArgs e)
{
// Display whether the delete operation succeeded.
if (e.Exception == null)
{
Response.Write( "Row deleted successfully.");
}
else
{
Response.Write("An error occurred while attempting to delete the row.");
e.ExceptionHandled = true;
}
}
protected void gv1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
}
回复:#3
我认为问题在于您将参数 class 用作删除参数。参数 class 是一个基础 class,它不包含您想要的信息 - 它不会从单击删除按钮的行中获取 ID,也不会传递给delete 命令,我假设你得到一个 SQL 异常。 (或者你可能会得到一个不同的错误,因为它试图传递两个 id 参数,但找不到接受两个参数的函数。还没有调查)
如果您删除删除参数,您将 id 设置为 DataKeyName 意味着它应该自动传递给您的删除命令。
以上信息有误。除了带有自动生成的删除按钮的 DataKeyName 之外,使用删除参数似乎不会引起任何问题。
实际问题是使用 DataSource 将 GridView 与 SQLDataSource 相关联,而不是使用 DataSourceID。 DataSource 不会在回发时持久存在,而 DataSourceID 会。我不完全确定引擎盖下发生了什么,但是在页面生命周期中被丢弃的数据源搞砸了 Delete 方法调用,所以它永远不会发生。
长话短说,在使用控件作为数据源时使用 DataSourceID 属性,在使用对象(例如 DataTable)作为数据源时使用 DataSource属性。
尽管我试图了解 gridview 的删除方法,但我仍然不知道如何删除一行。我正在使用相同的 gridview 来显示 4 SQL tables。根据选择的 table,我进入 swich 案例以更改 SQLDataSource 的 SELECT 和 DELETE 命令。我不确定这是否是最佳做法,但 SELECT 部分有效。
我需要一些帮助的是删除部分。
- 关于如何实现我的目标,我的思维过程是否正确?
- 我必须有 OnRowDeleting="gv1_RowDeleting" 否则它给了我一个 错误。这是强制性的吗?
- 我的代码为什么不起作用?
.ASPX:
<form id="form1" runat="server">
<div class="listTitle"><% Response.Write(strListTitle); %>
<asp:GridView ID="gv1"
runat="server"
DataKeyNames="id"
CellPadding="2"
AutoGenerateDeleteButton="True"
OnRowDeleting="gv1_RowDeleting"
OnRowDeleted="gv1_deleteItem">
</asp:GridView>
</div>
</form>
</div> <!-- close middle -->
<div id="footer">
<asp:SqlDataSource ID="DS" runat="server" ConnectionString="<%$ ConnectionStrings:conn %>">
<DeleteParameters> <asp:Parameter Name="id"/> </DeleteParameters>
</asp:SqlDataSource>
</div>
.CS 文件:
switch (strType)
{
case "servers":
DS.SelectCommand = "SELECT * FROM tbServers";
DS.DeleteCommand = "DELETE FROM tbServers WHERE id = @id";
strListTitle = "Server List";
break;
case "systems":
DS.SelectCommand = "SELECT * FROM tbSystems";
DS.DeleteCommand = "DELETE FROM tbSystems WHERE id = @id";
strListTitle = "System List";
break;
case "itOwners":
DS.SelectCommand = "SELECT * FROM tbITowners";
DS.DeleteCommand = "DELETE FROM tbITowners WHERE id = @id";
strListTitle = "IT Owner List";
break;
case "systemOwners":
DS.SelectCommand = "SELECT tbSystemOwners.id, tbITowners.owner, tbSystems.Systems FROM tbITowners INNER JOIN tbSystemOwners ON tbITowners.id = tbSystemOwners.idITowners INNER JOIN tbSystems ON tbSystemOwners.idSytems = tbSystems.id";
DS.DeleteCommand = "DELETE FROM tbSystemOwners WHERE id = @id";
strListTitle = "System Owner List";
break;
default:
break;
}
gv1.DataSource = DS;
gv1.DataBind();
}
protected void gv1_deleteItem(object sender, GridViewDeletedEventArgs e)
{
// Display whether the delete operation succeeded.
if (e.Exception == null)
{
Response.Write( "Row deleted successfully.");
}
else
{
Response.Write("An error occurred while attempting to delete the row.");
e.ExceptionHandled = true;
}
}
protected void gv1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
}
回复:#3
我认为问题在于您将参数 class 用作删除参数。参数 class 是一个基础 class,它不包含您想要的信息 - 它不会从单击删除按钮的行中获取 ID,也不会传递给delete 命令,我假设你得到一个 SQL 异常。 (或者你可能会得到一个不同的错误,因为它试图传递两个 id 参数,但找不到接受两个参数的函数。还没有调查)
如果您删除删除参数,您将 id 设置为 DataKeyName 意味着它应该自动传递给您的删除命令。
以上信息有误。除了带有自动生成的删除按钮的 DataKeyName 之外,使用删除参数似乎不会引起任何问题。
实际问题是使用 DataSource 将 GridView 与 SQLDataSource 相关联,而不是使用 DataSourceID。 DataSource 不会在回发时持久存在,而 DataSourceID 会。我不完全确定引擎盖下发生了什么,但是在页面生命周期中被丢弃的数据源搞砸了 Delete 方法调用,所以它永远不会发生。
长话短说,在使用控件作为数据源时使用 DataSourceID 属性,在使用对象(例如 DataTable)作为数据源时使用 DataSource属性。