Включение элементов списка с привязкой к данным в 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, но единственным результатом этого было полное удаление элемента списка из раскрывающегося списка.