2011-12-29 99 views
1

我正在尝试使用模板字段按钮来查看DataList中的一些数据,该按钮删除所选行的值。但是,当我测试它时,删除按钮将删除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(); 
    } 
} 
+1

我没有看到你所得到的选定行? 你只是遍历每一行并触发删除方法。所以它会删除每个项目... – 2011-12-29 16:12:03

+0

好吧,我该如何修改? – 2011-12-29 16:12:50

+0

检查下面的答案...我真的不知道这DataList2是什么。但是我已经在 – 2011-12-29 16:20:57

回答

1

尝试是这样的:

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(); 

     } 
0

我想你想要像

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); 
+0

以下建议了一些解决方案。有'DataList.SelectedItem',但该属性与在其中一个项目上执行的'Select'命令相关,并且与特定行上的按钮按压并不紧密相关。换句话说,不同的项目可以是'SelectedItem',而不是单击'Button'的项目,除非你完全正确地编写了所有的东西(而且你没有详细说明)。无论哪种方式,在我看来,处理'DataList.ItemCommand'和在'Button'上使用绑定表达式更简单,更健壮。 – pseudocoder 2011-12-29 16:32:58

1

你遍历整个数据列表中的项目列表(使用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. 
    } 
} 
+0

whwat我说,但使用实际的属性名称:) – 2011-12-29 16:37:14