【问题标题】:Deleting record from gridview in ASP.NET application从 ASP.NET 应用程序的 gridview 中删除记录
【发布时间】:2016-09-26 14:08:48
【问题描述】:

我在页面上有以下网格视图,以显示具有“审阅者”角色的用户。网格正确地拉起记录。在 gridview 上有一个“删除”按钮,用于删除 Reviewer 角色。手动运行时调用的存储过程正常工作,但我似乎在 aspx 或代码隐藏页面上缺少某些内容,因为没有返回错误,也没有删除记录。

gridview的aspx控件:

 <asp:GridView ID="GridView1" runat="server" Caption="Current Reviewers" AllowSorting="True" PagerSettings-Mode="NumericFirstLast" OnPageIndexChanging="GridView1_PageIndexChanging"
CaptionAlign="Top" EmptyDataText="No Reviewers Configured." PageSize="10" AllowPaging="true" PagerStyle-HorizontalAlign="Center" PagerStyle-Font-Size="Large"
AutoGenerateColumns="false" AlternatingRowStyle-BackColor="#cccccc" DataKeyNames="UserId" OnRowDeleting="DeleteRecord">
<Columns>

     <asp:BoundField DataField="UserId" HeaderText="Id" ItemStyle-Width="300" />
    <asp:BoundField DataField="Name" HeaderText="Name" ItemStyle-Width="250" />
    <asp:TemplateField HeaderText="Delete?">
                    <ItemTemplate>
                        <span onclick="return confirm('Are you sure to Delete the record?')">
                            <asp:LinkButton ID="lnkB" runat="Server" Text="Delete" CommandArgument='<%# Eval("UserId") %>' CommandName="DeleteRecord"></asp:LinkButton>
                        </span>
                    </ItemTemplate>
                </asp:TemplateField>
</Columns>

</asp:GridView>

已更新完整代码:

namespace cs1.Admin
{
public partial class ReviewerMaintenance : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindDropDownList1();
        }
    }
    private void BindDropDownList1()
    {

        string connectionString = WebConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
        string selectSQL = String.Format("SELECT Id as UserId, FirstName + ' ' + LastName As Name from AspNetUsers where Id in(SELECT  UserId from AspNetUserRoles where RoleId = 1)");
        SqlConnection con = new SqlConnection(connectionString);
        SqlCommand cmd = new SqlCommand(selectSQL, con);
        SqlDataAdapter adapter = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();

        adapter.Fill(ds, "Reviewer");

        GridView1.DataSource = ds;
        GridView1.DataBind();
    }
    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        GridView1.PageIndex = e.NewPageIndex;
        BindDropDownList1(); //bindgridview will get the data source and bind it again
    }

    protected void DeleteRecord(object sender, GridViewDeleteEventArgs e)
    {
        string UserId = GridView1.DataKeys[e.RowIndex].Value.ToString();
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ToString());
        SqlCommand dCmd = new SqlCommand();
        {
            conn.Open();
            dCmd.CommandText = "Reviewer_Delete";
            dCmd.CommandType = CommandType.StoredProcedure;
            dCmd.Parameters.Add("@UserId", SqlDbType.NVarChar).Value = UserId;
            dCmd.Connection = conn;
            dCmd.ExecuteNonQuery();
            // Refresh the data

            BindDropDownList1();
            dCmd.Dispose();
            conn.Close();
            conn.Dispose();

        }

    }


}
}

【问题讨论】:

  • 如果你在DeleteRecord 方法中设置断点,它会被命中吗?我不确定您用于绑定到该方法的语法是否正确。
  • 我们能看到你创建的存储过程吗?
  • @TZHX - 我尝试设置断点,但代码确实停止并等待被告知按预期继续,所以看起来一切都被调用了。
  • 仅供参考,请改用using-statement,这样即使出现错误,您也可以确保连接关闭。
  • 您已评论// Refresh the data,但您的代码没有刷新网格

标签: c# asp.net


【解决方案1】:

尝试使用 GridView 的OnRowCommand 事件来处理。

在您的 Gridview 标记中

确保OnRowCommand="GridView1_RowCommand" 存在。

在你的代码后面

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    { /* Set a breakpoint here and make sure: 
           A.) You are hitting this method 
           B.) Get value of e.CommandName */
        if (e.CommandName == "EditRecord")
        {
            // Run your edit/update logic here if needed
        }
        if (e.CommandName == "DeleteRecord")
        {
            // Delete the record here
            string UserId = GridView1.DataKeys[e.RowIndex].Value.ToString();
            SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ToString());
            SqlCommand dCmd = new SqlCommand();
            {
                conn.Open();
                dCmd.CommandText = "Reviewer_Delete";
                dCmd.CommandType = CommandType.StoredProcedure;
                dCmd.Parameters.Add("@UserId", SqlDbType.NVarChar).Value = UserId;
                dCmd.Connection = conn;
                dCmd.ExecuteNonQuery();
                // Refresh the data

                BindDropDownList1();
                dCmd.Dispose();
                conn.Close();
                conn.Dispose();
        }
    }

【讨论】:

  • = 添加上述结果会导致错误:“admin_reviewermaintenance_aspx”不包含“GridView1_RowCommand”的定义,并且找不到接受“admin_reviewermaintenance_aspx”类型的第一个参数的扩展方法“GridView1_RowCommand”(是您缺少 using 指令或程序集引用?)
【解决方案2】:

这最终成为一件非常简单的事情。在 aspx 页面上,我将 OnRowDeleting 和 CommandName 元素设置为相同的“DeleteRecord”值。

将 CommandName 值更改为“Delete”允许评估代码并成功调用存储过程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 2012-04-27
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    相关资源
    最近更新 更多