运行DELETE SQL查询后,ASP.NET页面不会刷新

时间:2011-11-17 10:04:23

标签: c# asp.net sql visual-studio

我正在使用VS2005。目前我在gridview中有一个删除linkBut​​ton,如果我按下它删除一行,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刷新页面。希望它能帮助像我这样的新手遇到这个错误。

非常感谢所有提供帮助的人

6 个答案:

答案 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。