我正在使用VS2005。目前我在gridview中有一个删除linkButton,如果我按下它删除一行,GridView就会变空,我将不得不再次点击该链接来访问该页面。
以下是我的代码:.aspx:
<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1" ondatabound="gv_DataBound" OnSelectedIndexChanged="GridView1_SelectedIndexChanged">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="UserSelection" OnCheckedChanged="UserSelector_CheckedChanged" runat="server" />
<asp:LinkButton ID="lnkDelete" runat="server" onclick="lnkDelete_Click" Text="Delete" CommandArgument='<%# Eval("Employee") %>' ></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
以下是我的.cs
代码protected void lnkDelete_Click(object sender, EventArgs e)
{
LinkButton lnk = (LinkButton)sender;
string stid = lnk.CommandArgument.ToString();
SqlDataSource1.SelectCommand = "DELETE FROM [UserDB]where Employee like '%"+stid+"%'";
SqlDataSource1.DataBind();
}
我尝试将删除查询分配给SqlDataSource1并选择查询到source2,但如果是这种情况,我的删除查询将无效。
我也尝试在我的PageLoad方法上使用IsPostBack,但点击删除按钮后GridView也会变空。
目前我的两个查询都分配给了SqlDataSource1,一旦删除了查询,该页面就会变为空白,但查询会被删除。
我是否知道如何在运行删除查询后刷新页面或重新加载GridView表?
谢谢。
感谢你们的帮助,问题解决了。目前我的工作代码如下:
LinkButton lnk = (LinkButton)sender;
string stid = lnk.CommandArgument.ToString();
SqlConnection conn = new SqlConnection("DATA-SOURCE");
string sql = string.Format("DELETE FROM [UserDB] where Employee like '%{0}%'",stid);
SqlCommand cmd = new SqlCommand(sql,conn);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
SqlDataSource1.SelectCommand = "SELECT * FROM [UserDB]";
SqlDataSource1.DataBind();
Response.Redirect("/Project/UserList.aspx");
我使用sql连接字符串进行删除查询,然后使用sqldatasource进行select查询,最后使用response.redirect刷新页面。希望它能帮助像我这样的新手遇到这个错误。
非常感谢所有提供帮助的人
答案 0 :(得分:2)
为什么要为DELETE
属性分配SelectCommand
命令?
只需在SqlCommand
的单独ExecuteNonQuery
实例上运行DELETE并提交。另一种选择是使用现有SqlDataSource
的{{3}}。
另一点:
构建DELETE
SQL的方式容易受到称为SQL注入的严重安全问题的影响 - 最简单,最好的方法就是使用绑定参数!
答案 1 :(得分:2)
首先,您应该了解ASP.NET中的数据绑定可以为您做什么。 (那么你不必为这种情况编写任何代码隐藏。)
示例:(未在VS中测试)
您应该使用SqlDataSource的DeleteCommand来设置delete命令及其参数,如下所示:
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="..."
SelectCommand="..."
DeleteCommand="DELETE FROM [UserDB] WHERE Employee=@Employee">
<DeleteParameters>
<asp:Parameter Name="Employee" />
</DeleteParameters>
</asp:SqlDataSource>
在GridView上,你应该设置DataKeyNames属性,在ItemTemplate的Linkbutton中你应该将CommandName属性设置为“Delete”,如下所示:
<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1"
ondatabound="gv_DataBound" DataKeyNames="Employee"
OnSelectedIndexChanged="GridView1_SelectedIndexChanged">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="UserSelection" runat="server"
OnCheckedChanged="UserSelector_CheckedChanged" />
<asp:LinkButton ID="lnkDelete" runat="server"
onclick="lnkDelete_Click" Text="Delete"
CommandArgument='<%# Eval("Employee") %>'
CommandName="Delete" ></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
答案 2 :(得分:0)
将更改操作(在您的示例中为DELETE
)作为SelectCommand
运行是错误的。 SelectCommand
必须按原样使用 - 仅限于SELECT
s。
单独运行DELETE
查询,然后运行SELECT
命令以显示网格的相关记录。
答案 3 :(得分:0)
试试这个
protected void lnkDelete_Click(object sender, EventArgs e)
{
LinkButton lnk = (LinkButton)sender;
string stid = lnk.CommandArgument.ToString();
SqlConnection conn = new SqlConnection(<put your connectionstring here>);
string sql = string.Format("DELETE FROM [UserDB] where Employee like '%{0}%'",stid);
SqlCommand cmd = new SqlCommand(sql,conn);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
BindTheGridView();
//or you can use SelectCommand of your SqlDataSource1 and can bind again simply.
}
编辑:
public void BindTheGridView()
{
SqlConnection conn = new SqlConnection(Connstring);
string sql = "Select * from [UserDB]";
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dtb = new DataTable();
da.Fill(dtb);
conn.Close();
SqlDataSource1.DataSource = dtb;
SqlDataSource1.DataBind();
}
你可以随时调用它来绑定值。
答案 4 :(得分:0)
SqlDataSource1.SelectCommand =“DELETE FROM [UserDB],其中员工喜欢'%'+ stid +”%'“; SqlDataSource1.DataBind(); 强>
为什么在SelectCommand中使用Delete查询。该查询对SqlInjection攻击开放。我会使用存储过程并在将参数传递给过程之前验证该参数。
此外,Grid不会显示/绑定任何数据,因为您的代码不会返回任何数据。它只是删除数据。
答案 5 :(得分:0)
我猜你可以做一个gridview.DataBind()而不是sqlDatasource.databind。 gridviews databind在内部执行sqldatasource数据绑定并刷新gridview。