[英]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.