我需要一些帮助。我正在构建一个自定义Web用户控件,它将采用颜色。
截至目前,它在页面上有两个[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; } }
请注意,我知道DefaultValue仅适用于visual studio属性窗口,并且实际上并未设置任何值。
但是,我试图在usercontrol的构造函数中设置默认值:
ForegroundColor = "000000"
这给了我一个例外,因为在构造函数的时候,foregroundColorSelectorHex是 null 。
因此,如果我尝试在 OnInit 事件中设置默认值,或者在 * Page_Load * 上设置默认设置,那么它只会始终使用默认值I set和“AABBCC”的set属性值被覆盖。
我尝试做什么的正确方法是什么?
谢谢。
答案 0 :(得分: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 :(得分:1)
我认为完整的答案在这里回答的时间太长了,而且已经在MSDN上进行了记录。
请参阅此页:http://msdn.microsoft.com/en-us/library/ms972975.aspx
搜索“向用户控件添加属性和方法”文本
(但是请完整阅读整篇文章,以便了解细节。)
但是,从文章的代码中,如果属性为null,应该如何返回默认值。假设您有一个名为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;
}
}
您可以使用相同的模式来定义颜色。
答案 2 :(得分:1)
尝试在viewstate中保留属性的值,然后在Page_PreRender中设置.Text,如下所示:
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;
}
答案 3 :(得分:0)
不确定这会有效,但您可以在page_load中执行以下操作:
protected void Page_Load {
if (String.IsNullOrEmpty(ForegroundColor))
ForegroundColor = "FFFFFF";
}
答案 4 :(得分:0)
您应该在不回发时初始化该值,即
if(!Page.IsPostBack){
//Initialize your values
ForegroundColor = "FFFFFF";
}
答案 5 :(得分: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";
}