2012-04-02 9 views
2

私は以下のようなドロップダウンリストボックスを持っています。ある条件下で、databoundイベントで、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をデータバインドしないようにしてください。そうしないと、削除したものがすべて返されます。

EDIT:より効率的で洗練されたソリューションについては、James Johnson's answerを参照してください。代わりにItemDataBoundイベントでアイテムを除去する

+0

がポスターの答えを批判しない?:結合する前にデータソースをフィルタリングしていないが、これは問題を解決するための効率的なまたはエレガントな方法でもありません... –

+1

@JamesJohnsonいいえ、批判のように聞こえるわけではありません*あなたの答えに+1、それは非常にエレガントです! – jadarnel27

+1

私は実際にOPが使用していた実装にこだわっていたので、本当にあなたを批判していませんでした。もっと効率的な方法があることを指摘していました。私はあなたが堅実なコードを投稿しているのを見ているので、あなたが少しでもそれを取らなかったことを願っています。 –

1

は、なぜそれが

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(); 
    }   
} 
関連する問題