监听DataList内部的按钮事件

本文关键字:按钮 事件 内部 DataList 监听 | 更新日期: 2023-09-27 18:18:58

我试图查看DataList内的一些数据,其中包含删除所选行的值的模板字段按钮。然而,当我对它进行测试时,删除按钮删除了DataList中的所有值,而不仅仅是选中的字段。这是我的代码。有人知道我做错了什么吗?

protected void Button12_Click(object sender, EventArgs e)
{
    foreach (DataListItem item in DataList2.Items)
    {
        Label post_IDLabel = (Label)item.FindControl("post_IDLabel");
        string connStr = ConfigurationManager.ConnectionStrings["MyDbConn"].ToString();
        SqlConnection conn = new SqlConnection(connStr);
        SqlCommand cmd = new SqlCommand("delete_post", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        int post_ID = Convert.ToInt32(post_IDLabel.Text);
        string email = Session["email"].ToString();
        int course_ID = Convert.ToInt32(Request.QueryString["courseID"]);
        cmd.Parameters.Add(new SqlParameter("@course_ID", course_ID));
        cmd.Parameters.Add(new SqlParameter("@myemail", email));
        cmd.Parameters.Add(new SqlParameter("@post_ID", post_ID));
        conn.Open();
        cmd.ExecuteNonQuery();
        conn.Close();
    }
}

监听DataList内部的按钮事件

试试这样:

protected void delete(object sender, CommandEventArgs e) 
    {
        if ((e.CommandName == "delete") && (e.CommandArgument != null))
        {
                string connStr = ConfigurationManager.ConnectionStrings["MyDbConn"].ToString();
                SqlConnection conn = new SqlConnection(connStr);
                SqlCommand cmd = new SqlCommand("delete_post", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                int post_ID = (int) e.CommandArgument;
                string email = Session["email"].ToString();
                int course_ID = Convert.ToInt32(Request.QueryString["courseID"]);
                cmd.Parameters.Add(new SqlParameter("@course_ID", course_ID));
                cmd.Parameters.Add(new SqlParameter("@myemail", email));
                cmd.Parameters.Add(new SqlParameter("@post_ID", post_ID));
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
                DataList2.DataBind();
        }

现在您正在遍历数据列表中的整个项目列表(使用foreach循环),因此自然所有项目都会受到影响。

我认为做你想做的最简单的方法是处理DataList。ItemCommand事件,并使用绑定表达式将键值传递给代码。

标记:

<asp:DataList ID="DataList1" runat="server" OnItemCommand="DataList1_ItemCommand">
    <ItemTemplate>
        <asp:Button ID="Button12" runat="server" Text="Button" CommandName="MyDelete" CommandArgument='<%# Eval("MyId") %>' />
    </ItemTemplate>
</asp:DataList>
代码:

protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
{
    if ((e.CommandName == "MyDelete") && (e.CommandArgument != null))
    {
        //Add delete code here using e.CommandArgument to identify the correct record.
    }
}

我想你应该是这样的

var item = DataList2.Items.SelectedItem??

或者如果您可以在发送器中传递您正在查找的项目的id的一些参数

Button btn = (Button)Sender;
int selectedItemId = int.parse(btn.Arguments["Someproperty"]);
var item = DataList2.Items.Single(i => i.Id == selectedItemId);