I am in need of some help. I am building a custom web user control which is going to be picking colours.
As of right now, it has two [asp:textbox]es on the page (foregroundColour and backgroundColour).
I want my foreground colour to default to "FFFFFF" and my background colour to default to "000000", AND I the user to be able to specify their own initial values though the tag.
<ucFontChooser id="testchooser" runat="server" foregroundcolor="AABBCC" />
I have two properties that are tied to the textboxes:
[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; } }
Please note that I am aware that the DefaultValue is only for the visual studio property window and doesn't actually set any value.
However, I have tried to set the default value by in the construct开发者_开发问答or of the usercontrol to do:
ForegroundColor = "000000"
This gives me an exception, because at the point of the constructor, the foregroundColorSelectorHex is null.
So if I try and setting the default in the OnInit event, or on *Page_Load* then it simply always uses the default I set and the set property value of "AABBCC" is overwritten.
What is the correct way to do what am I trying?
Thank you.
After much debugging, I came up with a solution to do exactly what I need.
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";
}
the .NET framework will call mycontrol.ID = "bla", which is when the user controls subcontrols come into context. It is called BEFORE the containing control/page reads the tags attributes and sets the properties.
Looks hacky, but works great.
I think a complete answer would be too long to answer here, and it's documented at MSDN already.
See this page: http://msdn.microsoft.com/en-us/library/ms972975.aspx
And search for the text "Adding Properties and Methods to a User Control"
(But read the whole article anyway so you understand the details.)
However, from the code in the article, it should you how to return a default value if the property is null. Assuming you have a property named CategoryID, the property should be defined as:
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;
}
}
You can use the same pattern to define the color.
Try keeping the value of the property in the viewstate and then setting the .Text in the Page_PreRender, like so:
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;
}
Not sure this will work, but could you do something like this in your page_load:
protected void Page_Load {
if (String.IsNullOrEmpty(ForegroundColor))
ForegroundColor = "FFFFFF";
}
You should initialize the value when it is not postback i.e.
if(!Page.IsPostBack){
//Initialize your values
ForegroundColor = "FFFFFF";
}
Can't you create your foregroundColorSelectorHex and backgroundColorSelectorHex in the constructor ?
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";
}
精彩评论