2012-04-02 52 views
2

我有一個下拉列表框,如下所示。在某些情況下,在數據綁定事件中,我想刪除其bitActive設置爲0(不活動)的項目。我沒有在selectCommand中放置WHERE bitAcive!= 0,因爲我只想在某些條件下將其刪除。有什麼辦法可以迭代項目並檢查bitActive的值嗎?如何根據ASP.net中的列名獲取ListItem?

<tr> 
      <td width="30%" align="right">Location<span class="littlefont">*</span></td> 
      <td width="70%" align="left"> 
       <asp:DropDownList ID="ddlLocation" runat="server" 
        DataSourceID="SqlDSLocation" DataTextField="txtRefLocation_Name" 
        DataValueField="intRefLocation_ID" ondatabound="ddlLocation_DataBound"> 
       </asp:DropDownList> 
       <asp:SqlDataSource ID="SqlDSLocation" runat="server" 
        ConnectionString="<%$ ConnectionStrings:SPRConnectionString %>" 
        SelectCommand="SELECT DISTINCT [intRefLocation_ID], [txtRefLocation_Name], [location], [bitActive] FROM [tblRefLocation] ORDER BY [intRefLocation_ID]"> 
       </asp:SqlDataSource> 
      </td> 
     </tr> 

回答

1

在代碼隱藏,你可以調用SQLDataSource.Select()方法:

System.Data.DataView dv = (System.Data.DataView)SqlDSLocation.Select(DataSourceSelectArguments.Empty); 

然後通過行迭代返回,發現誰設置爲零的「bitActive」行,並從DropDownList(代碼刪除它們從上面鏈接的示例中入侵):

foreach(System.Data.DataRow row in dv.Table.Rows) 
{ 
    // This is approximate logic, tailor this to fit your actual data 
    if (row["bitActive"].ToString() == "False") 
    { 
     ddlLocation.Items.Remove(row["intRefLocation_ID"].ToString()); 
    } 
} 

請注意,這不會從SQL表中刪除這些行。確保你不要在這之後再次綁定你的DropDownList--否則你剛剛移除的所有東西都會返回。

編輯:有關更高效優雅的解決方案,請參閱James Johnson's answer

+0

不要罵海報的答案之前過濾數據源,但這既不是解決問題的有效或優雅的方式... – 2012-04-02 18:31:09

+1

@JamesJohnson不,這聽起來不像批評* = * +1)你的答案,它*非常優雅! – jadarnel27 2012-04-02 18:40:06

+1

我真的沒有批評你,因爲你堅持OP已經使用的實現。我只是指出有更有效的方法。我希望你不要把它當作你的輕微,因爲我看到你發佈了一些可靠的代碼。 – 2012-04-02 18:50:13

1

而是在ItemDataBound事件刪除項目的,爲什麼不結合它?:

var table = new DataTable("MyTable"); //assume it's populated 
if (table.Rows.Count > 0) 
{ 
    var results = table.AsEnumerable().Where(r => r.bitActive).AsDataView().ToTable(); 
    if (!results.HasErrors) 
    { 
     DropDownList1.DataSource = results; 
     DropDownList1.DataBind(); 
    }   
} 
相關問題