我的ASP.Net webform包含许多文本框。我想在所有文本框中添加“onfocus”和“onmouseover”属性。我可以使用以下代码执行此操作:
TextBox1.Attributes.Add("onfocus", "javascript:this.select();");
TextBox1.Attributes.Add("onmouseover", "javascript:this.select();");
TextBox2.Attributes.Add("onfocus", "javascript:this.select();");
TextBox2.Attributes.Add("onmouseover", "javascript:this.select();");
TextBox3.Attributes.Add("onfocus", "javascript:this.select();");
TextBox3.Attributes.Add("onmouseover", "javascript:this.select();");
但是,自从没有。 TextBoxes超过35,我正在考虑使用循环来做到这一点。我尝试了以下代码:
if (!IsPostBack)
{
foreach (Control ctl in Controls)
{
if (ctl is TextBox)
ctl.Attributes.Add("onmouseover", "javascript:this.select();");
}
}
但是我收到以下错误:
'System.Web.UI.Control'不包含'Attributes'的定义,并且没有扩展方法'Attributes'接受类型'System.Web.UI.Control'的第一个参数可以找到(你错过了吗?) using指令或程序集引用?)
我做错了什么?
答案 0 :(得分:2)
你可以使用Linq的OfType
。它返回给定类型的所有控件。
我建议您将所有TextBoxes
添加到容器控件中,例如Panel
或PlaceHolder
:
foreach(var txt in txtPanel.Controls.OfType<TextBox>())
{
txt.Attributes.Add("onfocus", "javascript:this.select();");
txt.Attributes.Add("onmouseover", "javascript:this.select();");
}
确保您已添加using System.Linq
。
这是另一种类似的方法,它会查看当前页面中的所有面板:
this.Form.Controls.OfType<Panel>()
.SelectMany(p => p.Controls.OfType<TextBox>());
foreach (TextBox txt in allTextBoxes){}
请注意,您还可以使用Enumerable.Where
过滤Panels
或TextBoxes
(例如,如果面板的ID始于txtPanel_
,则为此。)
答案 1 :(得分:1)
ctl对象只是一个webcontrol,虽然你正在检查它是一个TextBox,但在使用它之前你不会把它作为一个...
...试
if (!IsPostBack)
{
foreach (Control ctl in Controls)
{
if (ctl is TextBox)
((TextBox)ctl).Attributes.Add("onmouseover", "javascript:this.select();");
}
}
答案 2 :(得分:1)
ctl的类型仍然是Control。为了使它成为TextBox,您可以像这样投射它:
((TextBox)ctl).Attributes.Add("onmouseover", "javascript:this.select();");
或使用as
运算符:
(ctl as TextBox).Attributes.Add("onmouseover", "javascript:this.select();");
这两者之间的区别在于as
如果演员表不成功将返回null
引用,并且演员会抛出异常,但是因为你已经使用{{1}进行了检查操作员,只需使用看起来更好的那个
但是,如果您使用多个赋值,我会将强制转换提取为变量,如:
is
答案 3 :(得分:0)
您必须将其强制转换为TextBox。 ctl仍然是一个Control,它没有Attributes属性。
((TextBox)ctl).Attributes.Add("onmouseover", "javascript:this.select();");