2012-04-02 3 views
2

Ich habe eine Dropdown-Liste wie folgt. Unter bestimmten Bedingungen möchte ich im datengebundenen Ereignis die Elemente entfernen, deren BitActive auf 0 (inaktiv) gesetzt ist. Ich habe im selectCommand kein WHERE bitAcive! = 0 gesetzt, weil ich sie nur unter bestimmten Bedingungen entfernen möchte. Gibt es eine Möglichkeit, die Items zu iterieren und den Wert von bitActive zu überprüfen?Wie erhält man das ListItem basierend auf dem Spaltennamen in ASP.net?

<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> 

Antwort

1

In Code-Behind Sie die SQLDataSource.Select() Methode aufrufen können:

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

die „bitActive“ Und dann durchlaufen die zurückgegebenen Zeilen, Zeilen zu finden, die auf Null und Entfernen Sie sie von Ihrem DropDownList (Code festgelegt werden Art von gehackt von dem oben verlinkten Beispiel):

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

Beachten Sie, dass dies diese Zeilen nicht aus Ihrer SQL-Tabelle entfernt. Stellen Sie sicher, dass Sie Ihre DropDownList danach nicht mehr zurückdatieren - sonst werden alle Sachen, die Sie gerade entfernt haben, zurückgeben.

EDIT: Für eine effizientere und elegante Lösung, siehe James Johnson's answer.

+0

nicht das Plakats Antwort zu kritisieren, aber das ist weder eine effiziente und elegante Art und Weise, das Problem zu lösen ... –

+1

@JamesJohnson Nein, das hört sich überhaupt nicht nach Kritik an * =) +1 zu deiner Antwort, es ist * sehr elegant! – jadarnel27

+1

Ich habe dich wirklich nicht kritisiert, weil du bei der Implementierung feststeckst, die OP schon benutzt hat. Ich habe nur darauf hingewiesen, dass es effizientere Wege gibt. Ich hoffe, du hast es nicht als eine Kleinigkeit empfunden, denn ich habe gesehen, wie du einen festen Code postest. –

1

Statt Elemente im ItemDataBound Ereignisse zu entfernen, warum filtern nicht nur die Datenquelle vor dem Binden es ?:

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