更改自定义控件的颜色
本文关键字:颜色 自定义控件 | 更新日期: 2023-09-27 18:30:18
我正在尝试设置自定义按钮的背景颜色。我通过重写 Render 方法从 HTML 构建该按钮。然后,我通过具有 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>
你应该使用类似于下面的函数:
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");
你肯定会找到你的控制权。
谢谢 伊戈尔和帕特里克等人,伟大的反馈让我回到了正确的道路上,即创建控件而不是直接动态编写 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);
}
}
}