Включение элементов списка с привязкой к данным в DropDownList

У меня есть выпадающий список, который используется в EditItemTemplate DetailsView, и он заполняется из SqlDataSource, и я связываю выбранное значение следующим образом:

<EditItemTemplate>
    <asp:DropDownList ID="lstLocations" runat="server" 
         DataSourceID="sqlMDALocationsAll" DataTextField="loc_name" DataValueField="id" 
         SelectedValue='<%# Bind("staff_location_id") %>' AppendDataBoundItems="True" >
         <asp:ListItem Value="">(Unknown)</asp:ListItem>
    </asp:DropDownList>
</EditItemTemplate>

Все работает как положено. Теперь я хочу включить только те связанные элементы списка на основе другого столбца в sqlDataSource - есть столбец "status", который может иметь значения как активного, так и неактивного - и если статус записи активен, то я хочу, чтобы соответствующий элемент списка был включен, в противном случае я хочу, чтобы он был отключен. Причина в том, что, поскольку это форма редактирования, я не хочу, чтобы люди могли выбирать неактивное значение, но мне нужно включить эти "неактивные" записи в раскрывающийся список, поскольку основная запись редактируемый объект может иметь идентификатор местоположения, которое сейчас неактивно.

Я пытался использовать следующее определение DropDownList:

Enabled='<%# Eval("status") = "active" %>'

Но это не сработало, но об ошибках не сообщалось.

Какие-либо предложения?

Спасибо

2 ответа

Решение

Вы не можете выполнить оценку с поздней привязкой внутри веб-элемента управления и внутри элемента управления данными, такого как DetailsView.

Назначьте значение для ItemDataBound. Проверьте этот похожий вопрос.

Ну, я обнаружил две вещи. Первое и самое важное, что.Net не позволяет отключать элементы списка в элементе управления раскрывающегося списка. Во-вторых, мне действительно пришлось принять предложение okw и использовать обработчик событий - я решил использовать событие onbadabound:

    Protected Sub lstLocations_DataBound(ByVal sender As Object, ByVal e As System.EventArgs)
    'Once the drop down list has been populated, we want to disable any locations whose status is inactive.
    Dim lstLocations As DropDownList = CType(Me.dgStaff.FindControl("lstLocations"), DropDownList)
    If Not lstLocations Is Nothing Then
        Dim dView As System.Data.DataView = CType(Me.sqlMDALocationsAll.Select(DataSourceSelectArguments.Empty), System.Data.DataView)
        If Not dView Is Nothing Then
            dView.Sort = "id"
            For nIndex As Integer = 0 To lstLocations.Items.Count - 1
                If lstLocations.Items(nIndex).Value <> "" Then
                    Dim rowIndex As Integer = dView.Find(CInt(lstLocations.Items(nIndex).Value))
                    Trace.Write("lstLocations_DataBound", "Location ID = " & lstLocations.Items(nIndex).Value & " Name = " & dView(rowIndex)("loc_name") & " Status = " & dView(rowIndex)("status"))
                    If dView(rowIndex)("status").ToString.ToLower.Trim = "inactive" Then
                        lstLocations.Items(nIndex).Text &= " (Unavailable)"
                    End If
                End If
            Next
        End If
    Else
        Trace.Write("lstLocations_DataBound", "FindControl failed")
    End If
End Sub

Первоначально строка lstLocations.Items(nIndex).Text &= " (Unavailable)" фактически устанавливала для свойства "enabled" этого элемента списка значение false, но единственным результатом этого было полное удаление элемента списка из раскрывающегося списка.

Другие вопросы по тегам