我想知道是否可以在c#中为Control
添加属性。
我有一个方法,它在参数中接收一个对象:
public void CreateTooltip(Object controltoadd = null)
{
var myDiv = new HtmlGenericControl("div");
myDiv.Attributes.Add("width", "100%");
myDiv.Attributes.Add("onmouseover", "ShowHint('" + this.GetType() + "','test');");
myDiv.Attributes.Add("onmouseout", "HideHint();");
if (controltoadd == null)
{
List<Control> listcc = new List<Control>();
for (int i = 0; i < this.Controls.Count; i++)
{
Control cc = this.Controls[i];
string test = cc.GetType().ToString();
listcc.Add(cc);
}
this.Controls.Clear();
for (int i = 0; i < listcc.Count; i++)
{
Control cc = listcc[i];
myDiv.Controls.Add(cc);
}
}
else
{
Control cc = (Control)controltoadd;
//Don't know what to do here...
}
this.Controls.Add(myDiv);
}
如果对象为null,我创建一个HtmlGenericControl("div")
,然后添加我想要的Attributes
。但问题是当Object不为null时,我将其转换为Control
,并且属性Attributes
不可用。我使用控件,因为我永远不知道在参数中收到的对象的类型是什么。
答案 0 :(得分:2)
您需要将其投射为WebControl
或HtmlGenericControl
我相信。 Control
不包含属性Attributes
。您可以使用is
来测试传递的对象。
if (control is WebControl)
{
var webControl = (WebControl)control;
}
或者如果您更喜欢使用as
:
var webControl = control as WebControl;
if (webcontrol != null)
{
// code
}
答案 1 :(得分:1)
因此,如果它实际上是WebControl
(Control
的子级别),那么您可以将其投射到它并使用它Attributes
property。您已经注意到Control
本身没有属性Attributes
:
WebControl wc = controltoadd as WebControl;
if(wc != null)
{
// wc.Attributes.Add...
}
如果它是HtmlControl
投射到那个:
else
{
HtmlControl hc = controltoadd as HtmlControl;
if(hc != null)
{
// hc.Attributes.Add...
}
}
另一种选择是使其成为一种只接受实现IAttributeAccessor
的控件的通用方法。 HtmlControl
和WebControl
都实现了获取/设置属性的接口。:
public void CreateTooltip<T>(T controlToAdd)where T: IAttributeAccessor, Control
{
// ....
controlToAdd.SetAttribute("width", "100%");
}