2012-03-27 77 views
1

我的单选按钮列表:天冬氨酸净绑定()的SelectedValue区分大小写

<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> 

它是一个FormView内:

<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,因为它不在项目列表中存在哪些无效

原因:

我从绑定(获得的值)是一个小写的“x”,值ListItem是大写'X'。

我的小写'x'和大写'X'在我的数据库中。

我试图找到一种方法来保持“绑定” functionnalities,并选择一个ListItem忽略大小写。

有什么建议吗?

谢谢!

+0

您是否尝试过使用绑定(“类型” ).toUpperCase()? – 2012-03-27 14:20:08

+0

我试图找到一种方法来使'绑定(“类型”)“上手,看起来像我们不能。 – JoRouss 2012-03-27 14:20:11

+0

如何填充下拉菜单?你不是用同一张桌子吗? – 2012-03-27 14:44:43

回答

1

绑定表达式可以用custom format使用,但在.net中有没有办法来指示格式为“小写”或“大写”的对象,所以你需要建立一个custom format provider。我不知道如何将这样的提供者“注入”绑定表达式,或者甚至是可能的(或者如果它值得付出的努力)。

由于使用的是EF,你可以当一个属性被改变,所以你可以编写代码来始终保存大写类型中使用的部分方法中受益。

partial void OnTypeChanged() 
     { 
      if (this._Type != null) 
      this._Type = this._Type.ToUpper(); 
     } 
+1

是的,我也读过关于自定义格式,也没有找到格式化ToUpper的方法。现在每个插入/更新都使用包含大写值的radiobuttonlist进行。我将不得不在一天内测试你的解决方案!谢谢你的帮助! – JoRouss 2012-03-28 12:09:46

0

我跑到一个脚本,让每一个“类型”数据库中的大写。现在我确保数据在插入/编辑时保存为大写字母。

让我知道如果你找到一种方法,使用绑定格式。

-1

样本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(); 
} 

您也可以修改数据表中的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

这与绑定功能有什么关系? – 2012-03-27 15:03:29

+0

这不是我所需要的 – JoRouss 2012-03-27 15:04:44

+0

我假设你在你的代码背后有绑定函数定义。在绑定函数中,您可以在绑定到控件之前验证数据,并最终将转换值分配给上限值。 – Pankaj 2012-03-27 15:18:27

0

因为我不想执行手册,我需要表现为不区分大小写的每一个下拉结合,我决定创建一个继承自定义控制下拉列表。我需要做的就是将其标记为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> 
相关问题