Поскольку я не хотел выполнять привязку вручную для каждого раскрывающегося списка, который должен был вести себя без учета регистра, я решил создать пользовательский элемент управления, который наследует DropDownList. Все, что мне нужно сделать, это пометить его как предназначенное для CaseInsensitive = True.
Вот код для новых элементов управления:
Imports System
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Text
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Namespace CSControls.Web
<DefaultProperty("SelectedValue"), ToolboxData("<{0}:CSDropDownList runat=server>/{0}:CSDropDownList>")> Public Class CSDropDownList
Inherits DropDownList
Private _RawSelectedValue As String
<Bindable(True), Category("Data"), Localizable(True)> Overrides Property SelectedValue() As String
Get
Return MyBase.SelectedValue
End Get
Set(ByVal Value As String)
_RawSelectedValue = Value
FixCaseSensitivity(False)
End Set
End Property
Private Sub FixCaseSensitivity(ForceValue As Boolean)
If CaseInsensitive Then
If Not Creditsoft.IsNothingNullOrEmpty(_RawSelectedValue) Then
If IsNothing(Me.Items.FindByValue(_RawSelectedValue)) Then
For Each item As ListItem In Me.Items
If item.Value.ToUpper() = _RawSelectedValue.ToUpper() Then
MyBase.SelectedValue = item.Value
Exit Sub 'New Selected Value was found so we can stop looping
End If
Next
If ForceValue Then 'ForceValue is TRUE when called from the OnDataBound. So in this case we need to let the application throw an exception because it's probably a programming error
MyBase.SelectedValue = _RawSelectedValue
End If
Else
MyBase.SelectedValue = _RawSelectedValue
End If
Else
MyBase.SelectedValue = Nothing
End If
Else
MyBase.SelectedValue = _RawSelectedValue
End If
End Sub
Protected Overrides Sub OnDataBinding(e As System.EventArgs)
MyBase.OnDataBinding(e)
End Sub
Protected Overrides Sub OnDataBound(e As System.EventArgs)
MyBase.OnDataBound(e)
FixCaseSensitivity(True)
End Sub
Private _CaseInsensitive As Boolean = False
<Category("Data"), DefaultValue("False")> Public Property CaseInsensitive As Boolean
Get
If IsNothing(ViewState("CaseInsensitive")) Then
Return _CaseInsensitive
Else
Return ViewState("CaseInsensitive")
End If
End Get
Set(value As Boolean)
ViewState("CaseInsensitive") = value
_CaseInsensitive = value
End Set
End Property
End Class
End Namespace
Затем Вы можете использовать его на своей странице aspx или в ascx-контроле следующим образом:
<%@ Register Namespace="CSControls.Web" TagPrefix="CSControlsWeb" %>
<CSControlsWeb:CSDropDownList id="ddlStates" runat="server" width="58px"
SelectedValue='<%# Bind("State") %>' AppendDataBoundItems="True"
DataSourceID="StatesDataSource" DataTextField="State"
DataValueField="State" CssClass="BoxEditable" CaseInsensitive="True" >
<asp:ListItem Value="">State</asp:ListItem>
</CSControlsWeb:CSDropDownList>