2014-11-13 2 views
0

Я пытаюсь установить цвет фона пользовательской кнопки. Я создаю эту кнопку из HTML, переопределяя метод Render. Затем я выставляю определенные атрибуты с помощью переопределенных атрибутов с помощью методов Get и set. Это позволяет мне изменять часть моей пользовательской кнопки после компиляции.Изменение цвета настраиваемого элемента управления

Я хочу изменить цвет кнопок div или таблицы (я не забочусь о том, какой). Как я могу это сделать?

У кнопки есть таблица - как я могу программно захватить эту таблицу, учитывая, что я знаю ее имя, buttonTable.FindControl не работает, я получаю ошибку «не задано для экземпляра объекта».

Panel buttonPnl = new Panel(); //Declare and Init here in case you need it for changing background color at code compile and not run time 
    System.Web.UI.WebControls.Image logoImg; 
    System.Web.UI.WebControls.Image errorImg; 
    TextBox mainTextTb; 
    Label subTextLbl; 

    protected override void CreateChildControls() 
    { 
     Controls.Clear(); 

     //init controls 
     //buttonPnl.Width = Unit.Pixel(200); 
     //buttonPnl.Height = Unit.Pixel(150); 
     buttonPnl.ID = "buttonPnl"; 

     logoImg = new System.Web.UI.WebControls.Image(); 
     logoImg.ID = "logoImg"; 
     logoImg.Width = Unit.Pixel(75); 
     logoImg.Height = Unit.Pixel(75); 

     errorImg = new System.Web.UI.WebControls.Image(); 
     errorImg.ID = "errorImg"; 
     errorImg.Width = Unit.Pixel(50); 
     errorImg.Height = Unit.Pixel(50); 

     mainTextTb = new TextBox(); 
     mainTextTb.ID = "mainTextTb"; 
     mainTextTb.Text = "changed"; 
     mainTextTb.Font.Size = 20; 
     mainTextTb.Width = Unit.Pixel(180); 


     subTextLbl = new Label(); 
     subTextLbl.ID = "subTextLbl"; 
     subTextLbl.Text = "sub text"; 
     subTextLbl.Font.Size = 12; 

     //add controls to parent control 
     this.Controls.Add(logoImg); 
     this.Controls.Add(errorImg); 
     this.Controls.Add(mainTextTb); 
     this.Controls.Add(subTextLbl); 
     this.Controls.Add(buttonPnl); 
    } 

    protected override void Render(HtmlTextWriter writer) 
    { 
     //render controls 
     buttonPnl.RenderControl(writer); 
     AddAttributesToRender(writer); 
     writer.RenderBeginTag(HtmlTextWriterTag.Div); //table start tag 
     writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "5"); 
     writer.AddAttribute(HtmlTextWriterAttribute.Width, "200"); 
     writer.AddAttribute(HtmlTextWriterAttribute.Id, "buttonTable"); 
     writer.RenderBeginTag(HtmlTextWriterTag.Table); //table start tag 
     writer.RenderBeginTag(HtmlTextWriterTag.Tr); //row start tag 
     writer.RenderBeginTag(HtmlTextWriterTag.Td); // cell start tag 
     logoImg.RenderControl(writer); //add logo image 
     writer.RenderEndTag(); //cell end tag 
     writer.RenderBeginTag(HtmlTextWriterTag.Td); //cell start tag 
     errorImg.RenderControl(writer); //add error image 
     writer.RenderEndTag(); //cell end tag 
     writer.RenderEndTag(); //row end tag 
     writer.RenderBeginTag(HtmlTextWriterTag.Tr); //row start tag 
     writer.AddAttribute(HtmlTextWriterAttribute.Width, "100%"); //make sure row width is 100% of parent 
     writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2"); //make sure row spans 2 cells 
     writer.RenderBeginTag(HtmlTextWriterTag.Td); //cell start tag 
     mainTextTb.RenderControl(writer); //add main text box 
     writer.RenderEndTag(); //cell end tag 
     writer.RenderEndTag(); //row end tag 
     writer.AddAttribute(HtmlTextWriterAttribute.Align, "right"); //make sure row width is 100% of parent 
     writer.RenderBeginTag(HtmlTextWriterTag.Tr); //row start tag 
     writer.AddAttribute(HtmlTextWriterAttribute.Width, "100%"); //make sure row width is 100% of parent 
     writer.AddAttribute(HtmlTextWriterAttribute.Colspan, "2"); //make sure row spans 2 cells 
     writer.RenderBeginTag(HtmlTextWriterTag.Td); //cell start tag 
     subTextLbl.RenderControl(writer); //add sub label 
     writer.RenderEndTag();//cell end tag 
     writer.RenderEndTag(); //row end tag 
     writer.RenderEndTag(); //table end tag 
     writer.RenderEndTag(); //div end tag 
    } 

    [Category("Appearance")] 
    [Description("Gets or sets the panel colour")] 
    public Color TimbusButtonColour 
    {     

     get 
     { 
      EnsureChildControls(); 
      Table buttonTbl = (Table)this.FindControl("buttonTable"); 
      //return buttonPnl.BackColor; 
      return buttonTbl.BackColor; 
     } 

     set 
     { 
      if (value != null) 
      { 
       Table buttonTbl = (Table)this.FindControl("buttonTable"); 
       //buttonPnl.BackColor = Color.FromArgb(value.R, value.G, value.B); 
       buttonTbl.BackColor = Color.FromArgb(value.R, value.G, value.B); 
      } 
     } 
    } 

в результате HTML от страниц исходного кода

</div><div id="Button1"> 
    <table cellpadding="5" width="200" id="buttonTable"> 
     <tr> 
      <td><img id="Button1_logoImg" src="" style="height:75px;width:75px;" /></td><td><img id="Button1_errorImg" src="" style="height:50px;width:50px;" /></td> 
     </tr><tr> 
      <td width="100%" colspan="2"><input name="Button1$mainTextTb" type="text" value="changed" id="Button1_mainTextTb" style="font-size:20pt;width:180px;" /></td> 
     </tr><tr align="right"> 
      <td width="100%" colspan="2"><span id="Button1_subTextLbl" style="font-size:12pt;">sub text</span></td> 
     </tr> 
    </table> 
</div> 
+0

Не можете ли вы установить фон buttonPnl и добавить все остальные элементы управления к этой панели? Это станет div при рендеринге, с установленным цветом фона. – Patrick

+0

Вы не должны ожидать найти то, что вы еще не создали. Представленный 'div' с' id = "buttonTable" 'не волшебным образом становится элементом' Table' в дереве управления. – Igor

+0

@patrick вы можете уточнить - вы хотите добавить элементы управления на панель, например buttonPanel.Controls.Add (controlsXXX); и затем this.add (buttonPanel); Я не могу это сделать, поскольку мне нужно позиционировать элементы управления внутри панели, поэтому я делаю это с помощью метода Render, используя div вместо панели Или вы имеете в виду добавить панель в html, например buttonPnl.RenderControl (writer) ;? проблема с этим заключается в том, как закрыть тег панели? – Fearghal

ответ

1

Вы должны использовать функцию, подобную этой:

public static Control FindControlRecursive(Control ctl, string id) { 
    if (!ctl.HasControls()) 
     return null; 
    Control res = null; 
    foreach(Control c in ctl.Controls) { 
     if (c.ID == id) { 
      res = c; 
      break; 
     } else { 
      res = FindControlRecursive(c, id); 
      if (res != null) 
       break; 
     } 
    } 
    return res; 
} 

таким образом:

Table buttonTbl = (Table)FindControlRecursive(this.Page, "buttonTable"); 

и вы будете Начните свой контроль.

+0

Рекурсивный поиск не имеет ничего общего с проблемой OP. Он ищет контроль, которого просто не существует. – Igor

+0

@SmartDev это хорошая идея, я все равно получаю ту же ошибку в экспоненциальном атрибуте TimbusButtonColour - «ObjectReference не установлен в экземпляр объекта». Я думаю, это может быть так, что таблица объявлена ​​внутри этого TimbusButtonColour, но я переместил ее наверх и все тот же вопрос. Помогите! – Fearghal

+0

@Igor - как я могу получить контроль над тегом html таблицы? – Fearghal

0

Thx Igor и Patrick et al., Отличная обратная связь вернула меня на правильный путь, т. Е. Создала элементы управления и не двигалась прямо к динамическому написанию html. кажется obv, но там вы идете.

protected override void CreateChildControls() 
    { 
     Controls.Clear(); 

     //init controls 
     buttonTbl = new Table(); 
     buttonPnl.ID = "buttonPnl"; 

     logoImg = new System.Web.UI.WebControls.Image(); 
     logoImg.ID = "logoImg"; 
     logoImg.Width = Unit.Percentage(100);//100% of cell width 
     logoImg.Height = Unit.Percentage(100);//100% of cell width 

     errorImg = new System.Web.UI.WebControls.Image(); 
     errorImg.ID = "errorImg"; 
     errorImg.Width = Unit.Percentage(50);//50% of cell width 
     errorImg.Height = Unit.Percentage(50);//50% of cell height 

     mainTextTb = new TextBox(); 
     mainTextTb.ID = "mainTextTb"; 
     mainTextTb.Text = "changed"; 
     mainTextTb.Font.Size = 20; 
     mainTextTb.Width = Unit.Percentage(100); 

     subTextLbl = new Label(); 
     subTextLbl.ID = "subTextLbl"; 
     subTextLbl.Text = "sub text"; 
     subTextLbl.Font.Size = 12; 

     //format table 
     buttonTbl.Width = 200; 
     buttonTbl.Height = 150; 
     buttonTbl.CellPadding = (int)Unit.Percentage(5).Value; 
     //add the 3 rows 
     buttonTbl.Rows.Add(imgRow); 
     buttonTbl.Rows.Add(mainTextRow); 
     buttonTbl.Rows.Add(subTextRow); 
     //add the cells 
     imgRow.Cells.Add(logoImgCell); 
     imgRow.Cells.Add(errorImgCell); 
     mainTextRow.Cells.Add(mainTextCell); 
     subTextRow.Cells.Add(subTextCell); 
     //add controls to their cells 
     logoImgCell.Controls.Add(logoImg); 
     errorImgCell.Controls.Add(errorImg); 
     mainTextCell.Controls.Add(mainTextTb); 
     subTextCell.Controls.Add(subTextLbl); 
     //position cells 
     logoImgCell.HorizontalAlign = HorizontalAlign.Right; 
     logoImgCell.VerticalAlign = VerticalAlign.Top; 
     errorImgCell.HorizontalAlign = HorizontalAlign.Right; 
     errorImgCell.VerticalAlign = VerticalAlign.Top; 
     mainTextCell.ColumnSpan = 2; 
     subTextCell.ColumnSpan = 2; 
     subTextCell.HorizontalAlign = HorizontalAlign.Right; 

     this.Controls.Add(buttonTbl); 
    } 

    protected override void Render(HtmlTextWriter writer) 
    { 
     //render controls 
     buttonTbl.RenderControl(writer); 
    } 

    [Category("Appearance")] 
    [Description("Gets or sets the panel colour")] 
    public Color TimbusButtonColour 
    {     
     get 
     { 
      EnsureChildControls(); 
      return buttonTbl.BackColor; 
     } 

     set 
     { 
      if (value != null) 
      { 
       buttonTbl.BackColor = Color.FromArgb(value.R, value.G, value.B); 
      } 
     } 
    } 
+0

вы оставили код, присваивающий значения переменным 'imgRow',' mainTextRow' и т. Д. – Igor

+0

добавил методы экспонирования атрибутов bgcolor – Fearghal

Смежные вопросы