2011-03-25 120 views
2

我需要一些帮助。我正在构建一个定制的Web用户控件,它将会选择颜色。asp.net用户控件默认属性值

截至目前,它在页面上有两个[asp:textbox] es(foregroundColour和backgroundColour)。

我希望我的前景色默认为“FFFFFF”,我的背景色默认为“000000”,并且用户可以通过标签指定自己的初始值。

<ucFontChooser id="testchooser" runat="server" foregroundcolor="AABBCC" /> 

我有被捆绑到文本框的两个属性:

[DefaultValue("000000")] 
public string ForegroundColor { get { return foregroundColorSelectorHex.Text; } set { foregroundColorSelectorHex.Text = value; } } 
[DefaultValue("FFFFFF")] 
public string BackgroundColor { get { return backgroundColorSelectorHex.Text; } set { backgroundColorSelectorHex.Text = value; } } 

请注意,我知道,将默认值仅适用于Visual Studio的属性窗口中,并不实际设置的任何值。

不过,我已经尝试设置默认值由用户控件的构造函数来做到:

ForegroundColor = "000000" 

这给了我一个例外,因为在构造来看,foregroundColorSelectorHex是null

所以,如果我尝试在的OnInit事件设置默认,或*的Page_Load *那么它只是始终使用我设置的默认和“AABBCC”的设定属性值将被覆盖。

什么是正确的方式做我想要什么?

谢谢。

回答

2

许多调试后,我想出了一个解决方案,做的正是我需要的。

public override string ID 
{ 
    set 
    { 
     base.ID = value; 
     InitializeProperties(); 
    } 
} 

protected void InitializeProperties() 
{ 
    ForegroundColor = "000000"; 
    BackgroundColor = "ffffff"; 
    EnableBackgroundColor = false; 
    PrimaryFont = "Arial"; 
    SecondaryFont = "Helvetica"; 
    TertiaryFont = "sans-serif"; 
} 

.NET框架将调用mycontrol.ID =“bla”,这是当用户控制子控件进入上下文。它被称为BEFORE包含控件/页面读取标签属性并设置属性。

看起来很不舒服,但效果很好。

1

我认为一个完整的答案在这里回答太长了,它已经在MSDN上有记录。

看到这个页面:http://msdn.microsoft.com/en-us/library/ms972975.aspx

,搜索文本“添加属性和方法到用户控件”

(但无论如何阅读整篇文章,以便您了解详情。)

但是,从文章中的代码,它应该如何返回默认值,如果该属性为空。假设您有一个名为CategoryID的属性,则应该将该属性定义为:

public int CategoryID 
{ 
    get 
    { 
     object o = ViewState["CategoryID"]; 
     if (o == null) 
     return 0; // return a default value 
     else 
     return (int) o; 
    } 
    set 
    { 
     ViewState["CategoryID"] = value; 
    } 
} 

您可以使用相同的模式来定义颜色。

0

不知道这会工作,但你可以做这样的事情在你的Page_Load:

protected void Page_Load { 
    if (String.IsNullOrEmpty(ForegroundColor)) 
     ForegroundColor = "FFFFFF"; 
} 
+0

这是在页面生命周期中赋值太晚的值。 – Matthew 2011-03-29 18:40:44

0

你应该初始化值时,它不回传即

if(!Page.IsPostBack){ 
    //Initialize your values 
    ForegroundColor = "FFFFFF"; 

} 
0

你能不能在构造函数中创建您的foregroundColorSelectorHex和backgroundColorSelectorHex?

public string ForegroundColor { 
    get { return foregroundColorSelectorHex.Text; } 
    set { foregroundColorSelectorHex.Text = value; } 
} 

public string BackgroundColor { 
    get { return backgroundColorSelectorHex.Text; } 
    set { backgroundColorSelectorHex.Text = value; } 
} 

public FontChooser() { 
    foregroundColorSelectorHex = new ColorSelector(); 
    backgroundColorSelectorHex = new ColorSelector(); 

    ForegroundColor = "FFFFFF"; 
    BackgroundColor = "000000"; 
} 
+0

我试过了,但asp.net只是在调用构造函数后创建了一个新的ColorSelector(),所以它们都被一个新对象覆盖。 – Matthew 2011-03-25 20:22:17

1

建议保持财产的价值在ViewState中,然后设置。文本中Page_PreRender,像这样:

public string ForegroundColor 
{ 
    get 
    { 
     if (ViewState["forecolor"] == null) 
     { 
      ViewState["forecolor"] = "000000"; 
     } 
     return (string) ViewState["forecolor"]; 
    } 
    set 
     { 
      ViewState["forecolor"] = value; 
     } 
} 

protected override void OnInit(EventArgs e) 
{ 
    this.PreRender += Page_PreRender; 
    base.OnInit(e); 
} 

private void Page_PreRender(object sender, EventArgs e) 
{ 
    foregroundColorSelectorHex.Text = ForegroundColor; 
}