Как получить ListItem на основе имени столбца в ASP.net? - PullRequest
2 голосов
/ 02 апреля 2012

У меня есть выпадающий список вроде следующего.При некоторых условиях в событии с привязкой к данным я хочу удалить элементы, для которых bitActive имеет значение 0 (неактивно).Я не поместил WHERE bitAcive! = 0 в команду selectCommand, потому что я хочу удалить их только при некоторых условиях.Можно ли как-то перебрать элементы и проверить значение bitActive?

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

Ответы [ 2 ]

1 голос
/ 02 апреля 2012

Вместо удаления элементов в событии 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();
    }        
}
1 голос
/ 02 апреля 2012

В codebehind вы можете вызвать метод 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, иначе все удаленные вами данные вернутся.

РЕДАКТИРОВАТЬ: Более эффективное и элегантное решение см. Ответ Джеймса Джонсона .

...