2011-12-29 96 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