【发布时间】:2014-11-13 14:21:47
【问题描述】:
我正在尝试设置自定义按钮的背景颜色。我通过覆盖 Render 方法从 HTML 构建该按钮。然后,我通过具有 Get 和 set 功能的客户覆盖的属性方法公开某些属性。这允许我在编译后更改自定义按钮的部分内容。
我想更改按钮 div 或 table 的颜色(我不在乎)。我该怎么做?
该按钮有一个表 - 如果我知道它的名称,我如何以编程方式获取该表;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>
【问题讨论】:
-
你不能设置 buttonPnl 的背景并将所有其他控件添加到该面板吗?这将在渲染时成为一个 div,并设置背景颜色。
-
你不应该期望找到你没有创建的东西。用
id="buttonTable"渲染的div不会神奇地变成控件树中的Table控件。 -
@patrick 你能详细说明一下吗 - 你的意思是像 buttonPanel.Controls.Add(controlsXXX); 这样将控件添加到面板中吗?然后 this.add(buttonPanel);我不能这样做,因为我需要在面板中放置控件,所以我通过使用 div 而不是面板的 Render 方法来做到这一点 或者你的意思是将面板添加到 html 中,如 buttonPnl.RenderControl(writer);?问题是我如何关闭面板标签?
-
@Igor 该表称为 buttonTable,不涉及任何魔法。我在结果页面 sourceCode 中检查了它。
-
好吧,不要......使用组件的属性,例如边距、填充、宽度和高度,看看会发生什么。你会得到一个更干净的控件类,因为你只在一个地方改变了外观。
标签: c# asp.net custom-controls findcontrol