1

我的 ASP.Net 网络表单包含许多文本框。我想为所有文本框添加“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' 的定义,并且找不到接受'System.Web.UI.Control' 类型的第一个参数的扩展方法'Attributes'(您是否缺少 using 指令还是汇编参考?)

我究竟做错了什么?

4

4 回答 4

2

你可以使用 Linq 的OfType. 它返回给定类型的所有控件。

我建议将所有内容添加TextBoxes到容器控件中,例如 a Panelor 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){}

请注意,您还可以过滤Panelsor TextBoxesEnumerable.Where如果面板的 id 全部以 开头txtPanel_)。

于 2012-09-14T12:12:05.450 回答
1

ctl 对象只是一个 web 控件,尽管您正在检查它是一个 TextBox,但在使用它之前您并没有将它作为一个对象进行转换......

尝试...

if (!IsPostBack)
{
    foreach  (Control ctl in Controls)
    {
        if (ctl is TextBox)
               ((TextBox)ctl).Attributes.Add("onmouseover", "javascript:this.select();");
    }
}
于 2012-09-14T12:10:00.890 回答
1

ctl 的类型仍然是 Control。为了让它成为一个文本框,你可以像这样转换它:

((TextBox)ctl).Attributes.Add("onmouseover", "javascript:this.select();");

或使用as运算符:

(ctl as TextBox).Attributes.Add("onmouseover", "javascript:this.select();");

这两者之间的区别在于,如果转换不成功,as它将返回一个引用,并且转换将引发异常,但是由于您已经使用运算符进行了检查,因此只需使用对您来说更好的那个。 但是,如果您使用多个分配,我会将强制转换提取到变量中,例如:nullis

if (ctl is TextBox)
{
  TextBox textBox = (TextBox) ctl;
  textBox.Attributes.Add("onmouseover", "javascript:this.select();")
  .....
}
于 2012-09-14T12:10:04.767 回答
0

您必须将其转换为文本框。ctl 仍然是一个控件,它没有 Attributes 属性。

((TextBox)ctl).Attributes.Add("onmouseover", "javascript:this.select();");
于 2012-09-14T12:10:09.110 回答