asp.net пользовательский контроль значений свойств по умолчанию - PullRequest
2 голосов
/ 25 марта 2011

Мне нужна помощь. Я создаю пользовательский веб-элемент управления, который будет выбирать цвета.

На данный момент на странице есть два [asp: textbox] (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 *, тогда он просто всегда использует значение по умолчанию, которое я установил, и значение установленного свойства "AABBCC" перезаписывается.

Как правильно делать то, что я пытаюсь?

Спасибо.

Ответы [ 6 ]

2 голосов
/ 29 марта 2011

После долгих отладок я пришел к решению, чтобы сделать именно то, что мне нужно.

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 Framework будет вызывать mycontrol.ID = "bla", когда пользователь управляет субконтролямивойти в контекст.Он называется ДО того, как содержащий элемент управления / страница считывает атрибуты тегов и устанавливает свойства.

Выглядит нахально, но прекрасно работает.

1 голос
/ 25 марта 2011

Попробуйте сохранить значение свойства в viewstate, а затем установите .Text в 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;
}
1 голос
/ 25 марта 2011

Я думаю, что полный ответ будет слишком длинным, и он уже задокументирован на 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;
   }
}

Вы можете использовать тот же шаблон для определения цвета.

0 голосов
/ 25 марта 2011

Не можете ли вы создать ваши 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 голосов
/ 25 марта 2011

Вы должны инициализировать значение, когда оно не отправлено, то есть

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

}
0 голосов
/ 25 марта 2011

Не уверен, что это сработает, но не могли бы вы сделать что-то подобное в вашей page_load:

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