Asp net Bind () выбрано значение с учетом регистра - PullRequest
1 голос
/ 27 марта 2012

Мой список RadioButtonList:

<asp:RadioButtonList ID="rblType" runat="server" selectedvalue='<%#Bind("Type")%>' AutoPostBack="true" >
         <asp:ListItem Text="X" Value="X" />
         <asp:ListItem Text="E" Value="E" />
         <asp:ListItem Text="H" Value="H" />
         <asp:ListItem Text="F" Value="F" />
         <asp:ListItem Text="A" Value="A" />
</asp:RadioButtonList>

Внутри формы:

<asp:FormView ID="fv" runat="server" DataSourceID="ds" DataKeyNames="ChartId,Type,ItemId"
    OnModeChanged="fv_ModeChanged">

Источник данных:

<asp:EntityDataSource ID="ds" runat="server" 
    ContextTypeName="Model.Entities"
    EntitySetName="ItemCharts" EnableInsert="true" EnableUpdate="true" AutoGenerateWhereClause="true"
    OnInserting="ds_Inserting" >
    <WhereParameters>
        <asp:QueryStringParameter Name="ItemId" DbType="Int32" QueryStringField="id" />
        <asp:QueryStringParameter Name="ChartId" DbType="Int32" QueryStringField="chart" />
        <asp:QueryStringParameter Name="Type" DbType="String" QueryStringField="type" />
    </WhereParameters>
</asp:EntityDataSource>

Сообщение об ошибке:

имеет значение SelectedValue, которое недопустимо, поскольку его нет в списке элементов

Причина:

Значение, которое я получаю из Bind () - это строчные буквы "x", значение ListItem - прописные буквы "X".

В моей базе данных есть строчные буквы "x" и прописные буквы "X".

Я пытаюсь найти способ сохранить функциональность 'Bind' и выбрать listItem, игнорируя чувствительность к регистру.

Есть предложения?

Спасибо!

Ответы [ 4 ]

1 голос
/ 27 марта 2012

Выражение Bind можно использовать с пользовательским форматом , но в .Net нет способа указать формату «нижний или нижний регистр» объекта, поэтому вам нужно создать поставщик нестандартного формата .Я не знаю, как «внедрить» такого провайдера в выражение Bind, или даже если это возможно (или если оно того стоит).

Поскольку вы используете EF, вы можете извлечь выгоду из используемых частичных методов.когда свойство изменяется, чтобы вы могли написать код, чтобы всегда сохранять тип в верхнем регистре.

  partial void OnTypeChanged()
        {
           if (this._Type != null)
             this._Type = this._Type.ToUpper();
        }
0 голосов
/ 18 апреля 2012

Поскольку я не хотел выполнять привязку вручную для каждого раскрывающегося списка, который должен был вести себя без учета регистра, я решил создать пользовательский элемент управления, который наследует 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>
0 голосов
/ 27 марта 2012

Пример HTML

<asp:RadioButtonList ID="ed" runat="server" selectedvalue=<%#ConvertToUpper(Eval("abc"))%> >
     <asp:ListItem Text="A" Value="A"></asp:ListItem>
</asp:RadioButtonList>

public static string ConvertToUpper(object value)
{
    return value.ToString().ToUpper();
}

Вы также можете изменить DataTable в вашем FormView

protected void FormView_DataBound(object sender, EventArgs e)
{
    DataTable Dt = ((System.Data.DataRowView)FormView.DataItem).DataView.ToTable();
    foreach (DataRow Dr in Dt.Rows)
    {
        Dr["abc"] = Dr["abc"].ToString().ToUpper();
    }
}

Мои данные тестирования

using (DataTable dt = new DataTable())
{
    using (DataColumn dc = new DataColumn("abc"))
    {
        dt.Columns.Add(dc);

        DataRow dr = dt.NewRow();
        dr["abc"] = "A";
        dt.Rows.Add(dr);

        dr = dt.NewRow();
        dr["abc"] = "b";
        dt.Rows.Add(dr);
    }
}
0 голосов
/ 27 марта 2012

Я запустил скрипт, чтобы все «Тип» в верхнем регистре в базе данных.Теперь я проверяю, что данные сохраняются в верхнем регистре при вставке / редактировании.

Дайте мне знать, если вы найдете способ использовать Bind для форматирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...