0

我有一个在 DetailsView 的 EditItemTemplate 中使用的下拉列表,它是从 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 中另一列的绑定列表项 - 有一个“状态”列可以具有活动或非活动的值 - 如果条目的状态是活动的,那么我希望启用相应的列表项,否则我希望将其禁用。原因是因为这是一个编辑表单,我不希望人们能够选择一个非活动的值,但我需要在下拉列表中包含那些“非活动”条目,因为主要条目是正在编辑的位置很可能具有现在不活动的位置的位置 ID。

我尝试使用的是 DropDownList 定义的以下内容:

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

但这不起作用 - 但没有报告任何错误。

有什么建议么?

谢谢

4

2 回答 2

1

您不能在 Web 控件和 DetailsView 等数据控件中执行后期绑定评估。

在 ItemDataBound 上分配值。看看这个类似的问题

于 2009-10-03T14:03:12.623 回答
0

嗯,我发现了两件事。首先,也是最重要的一点,.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)" 实际上将该列表项的“启用”属性设置为 false,但这样做的唯一效果是将列表项完全从下拉列表中删除。

于 2009-10-06T13:53:23.117 回答