簡體   English   中英

如何將枚舉值設置為Web用戶控件的自定義屬性?

[英]How to set an enum value to a custom property of a web user control?

我們如何將枚舉值綁定到Web用戶控件的屬性? 我一直收到此錯誤。

無法從其字符串表示形式“ MyEper.MyValue”的“ MyProperty”屬性創建“ MyEnum”類型的對象。

這是MyWebUserControl.ascx.cs背后的代碼

[System.ComponentModel.Bindable(true)]
public MyEnum MyProperty { get; set; }

SomeWebUserControl.ascx

<!-- This fails -->
<uc1:MyWebUserControl runat="server" ID="MyControl1"
    MyProperty="MyEnum.MyValue" />

<!-- This fails -->
<uc1:MyWebUserControl runat="server" ID="MyControl2" 
    MyProperty="<%# MyEnum.MyValue %>" />

<!-- This works -->
<uc1:MyWebUserControl runat="server" ID="MyControl3"
    MyProperty="0" />

定義控件上的屬性很容易,就像您已經做的那樣:

[System.ComponentModel.Bindable(true)]
public MyEnum MyProperty { get; set; }

但是,值得注意的是,不需要[Bindable(true)]屬性。 它只是為了提示VS在屬性網格中提供其他數據綁定屬性。 它根本不影響ASP.NET運行時。

要在ASPX標記中靜態設置此屬性,只需使用枚舉

<uc1:MyWebUserControl runat="server"
    ID="MyControl1"
    MyProperty="MyValue" />

如果要動態設置,可以在Page_Init

void Page_Init() {
    MyControl1.MyProperty = GetEnumValueFromSomewhere();
}

<uc1:MyWebUserControl runat="server"
    ID="MyControl1" />

最后,要將其動態設置為數據綁定的一部分,可以使用<%# foo %>數據綁定語法:

<uc1:MyWebUserControl runat="server"
    ID="MyControl1"
    MyProperty="<%# GetEnumValueFromSomewhere() %>" />

請注意, 只有在databinding時才應使用databinding選項。 如果您不嘗試進行數據綁定,則在整個頁面甚至僅在那個控件上調用DataBind()都是很浪費的。

此解決方法可能有助於解決問題。 您可以將“ real”屬性綁定到字符串屬性,如下所示:

private MyEnum _MyProperty = MyEnum.Default;

[System.ComponentModel.Bindable(true)]
public MyEnum MyProperty
{
    get {
        return _MyProperty;
    }
    set {
        _MyProperty = value;
    }
}

public string MyPropertyString 
{
    get {
        return _MyProperty.ToString();
    }
    set {
        _MyProperty = (MyEnum)Enum.Parse( typeof(MyEnum), value, true );
    }
}

並在控件上使用“ MyPropertyString”。 這不是一個優雅的解決方案,但可以解決問題。 似乎有比這更好的答案了,但是我環顧四周,卻找不到任何東西。

Page.DataBind()

  • Page.DataBind()是必需的-這就是所缺少的。
  • 該屬性上不需要[System.ComponentModel.Bindable(true)]

MyWebUserControl.ascx.cs

public MyEnum MyProperty { get; set; }

SomeWebUserControl.ascx

<uc1:MyWebUserControl runat="server" ID="MyControl" 
    MyProperty="<%# MyEnum.MyValue %>" />

SomeWebUserControl.ascx.cs

protected void Page_Load(object sender, EventArgs e)
{
    // this is 100% necessary to bind enum
    Page.DataBind();
}

另請參閱: 渲染DateTime.Now直接在ASPX頁面中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM