2015-01-09 33 views
1

我有一個從數據庫中提取信息並填充行的列表。列表項刪除不工作C#

我終於擺脫了錯誤,我找不到控件,但刪除按鈕運行不正常,頁面重新加載但不對數據庫執行任何操作。

我的想法是,列表項本身並不需要被刪除,因爲列表是在從數據庫加載頁面時填充的,包括回發,所以它不會通過刪除的行。

有人能指出我錯誤的方向嗎?

編輯

正如指出下面我通過刪除更改了的GetData()函數的使用:

using (SqlDataAdapter sda = new SqlDataAdapter()) 
        { 
         cmd.Connection = con; 
         sda.SelectCommand = cmd; 
         DataSet ds = new DataSet(); 
         sda.Fill(ds); 
         return ds; 
        } 

然而ASP列表視圖的下面片段不被帶回到theeLbl.Text被用作主要問題的控制ID。

<asp:ListView ID="List1" runat="server" GroupItemCount="3" GroupPlaceholderID="gph1" ItemPlaceholderID="iph1"> 
     <ItemTemplate> 
      <tr> 
       <td> 
        <asp:Label ID="uCompanylbl" runat="server" Text='<%# Eval("uCompanyId")%>'></asp:Label> 
       </td> 

C#代碼:

protected void deleteBtn_Click(object sender, EventArgs e) 
{ 
    using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalConnection"].ConnectionString)) 
    { 
     string query = @"DELETE FROM EndUser WHERE @someId = EndUser.uCompanyID; 
         DELETE FROM Company WHERE @someId = Company.Id; 
         DELETE FROM BAD WHERE @someId = BAD.Id;"; 
     using (SqlCommand cmd = new SqlCommand(query, con)) 
     { 
      int deleted = 0; 
      try 
      { 
       var theLbl = this.List1.FindControl("uCompanylbl") as Label; 

       cmd.Parameters.AddWithValue("@someId", theLbl.Text); 
       con.Open(); ; 
       deleted = cmd.ExecuteNonQuery(); 
      } 
      catch(Exception er) 
      { 
       Console.WriteLine(er.ToString()); 
      } 

     } 
    } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     List1.DataSource = this.GetData(); 
     List1.DataBind(); 
    }    
} 

private DataSet GetData() 
{ 
    // add connection code for error handling 
    using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalConnection"].ConnectionString)) 
    { 
     using (SqlCommand cmd = new SqlCommand("SelectProc", con)) 
     { 
      using (SqlDataAdapter sda = new SqlDataAdapter()) 
      { 
       cmd.Connection = con; 
       sda.SelectCommand = cmd; 
       using (DataSet ds = new DataSet()) 
       { 
        sda.Fill(ds); 
        return ds; 
       } 
      } 
     } 
    } 
} 
+0

刪除按鈕事件之後你沒有重新綁定您的名單? –

+0

刪除使用DataSet ds,然後將工作 – renefc3

回答

1

TL; DR - 這應該解決您的問題,任何問題,請讓我知道!

不完全確定它是什麼出錯你的代碼,因爲它不是所有的都在那裏。這就是說,我最近有一個類似的問題,我試圖弄清列表中所選項目的索引,但實際上並未選定。

我試着將你的代碼和我的代碼混合在一起,這樣你就可以看到錯誤發生的位置,並且做出輕微的修改,讓你的啓動和運行。如果有任何問題,請讓我知道,我會盡力彌補。

您可以在後端C#或ASP中爲此示例執行此操作,我通過ASP中的SQL數據源訪問數據庫。

ASP:

<asp:ListView ID="List1" runat="server" GroupItemCount="3" GroupPlaceholderID="gph1" ItemPlaceholderID="iph1" DataSourceID="sqlDataSource1"> 
       <ItemTemplate> 
       <tr> 
        <td> 
         <asp:Label ID="uCompanylbl" runat="server" Text='<%# Eval("uCompanyId")%>'/> 
        </td> 
<td> 
         <asp:LinkButton ID="Select" runat="server" Text="Select" Font-Bold="true" CommandName="Select" /> 
        </td> 
        </tr> 
    </ItemTemplate> 
    <SelectedItemTemplate> 
        <tr> 
         <td> 
          <asp:Label ID="hiding" runat="server" Text='<%# Eval("uCompanyId")%>' /> 
         </td> 
         <td> 
          <asp:Button ID="deleteBtn" runat="server" Text="Delete" OnClick="deleteBtn_Click1"/> 
         </td> 
    </tr> 
    </SelectedItemTemplate> 
    <asp:SqlDataSource ID="sqlDatasource1" runat="server" 
      ConnectionString="<%$ ConnectionStrings:LocalConnection%>" SelectCommand="SelectProc" CancelSelectOnNullParameter="true" DataSourceMode="DataReader"> 
     </asp:SqlDataSource> 

你可能已經工作的一些後端代碼,但我認爲最好的展示我究竟是如何走這工作:通過選定的索引查找通過ID列表控制(鏈接按鈕在asp中,將你帶到selectedtemplate)添加在控制ID的名稱來獲取值,在我的情況下,我正在尋找的DB值,然後將字符串轉換爲int並傳遞給存儲過程(如果可以幫助的話,不要使用字符串查詢)以及所有選擇/刪除任何內容的數據庫。

C#:

protected void deleteBtn_Click1(object sender, EventArgs e) 
     { 
      using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalConnection"].ConnectionString)) 
      { 
       using (SqlCommand cmd = new SqlCommand("DeleteProc", con)) 
       { 
        cmd.CommandType = CommandType.StoredProcedure; 
        try 
        { 
         ListViewItem item = List1.Items[List1.SelectedIndex]; 
         Label hdn = (Label)item.FindControl("hiding"); 
         string tmp = hdn.Text; 
         int sId = Int32.Parse(tmp); 
         cmd.Parameters.AddWithValue("someId", sId); 
         con.Open(); 
         cmd.ExecuteNonQuery(); 
        } 
        catch (Exception error) 
        { 
         Console.WriteLine(error.ToString()); 
        } 
       } 
      } 
     } 
3
    using (DataSet ds = new DataSet()) 
        { 
         sda.Fill(ds); 
         return ds; 
        } 

你有沒有意識到,這意味着所返回你以前Dispose DataSet中呢?

+0

重建沒有使用 - 歡呼,upvoted但仍然需要找到爲什麼列表控制值沒有被帶回。 – SelrekJohn

0

你可以做的另一種說法

dataset ds= new dataset(); 
sda.fill(ds); 
return ds;