开发者

asp.net user control default property values

开发者 https://www.devze.com 2023-02-19 15:40 出处:网络
I am in need of some help.I am building a custom web user control which is going to be picking colours.

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";
}
0

精彩评论

暂无评论...
验证码 换一张
取 消