2010-06-17 68 views
1

我需要将css类应用于Web窗体上的无效控件。我想让它成为一个可重用的课程。这是我到目前为止有:将CSS类应用于Web窗体上的无效控件

public class Validation 
{ 
    public static void ApplyInvalidClass(Page page, string className) 
    { 
     foreach (System.Web.UI.WebControls.BaseValidator bv in page.Validators) 
     { 
      if (!bv.IsValid) 
      { 
       Control ctrl = page.FindControl(bv.ControlToValidate); 

       if (ctrl != null) 
       { 
        if (ctrl is TextBox) 
        { 
         TextBox txt = ctrl as TextBox; 
         txt.CssClass = "invalid"; 
        } 

        if (ctrl is DropDownList) 
        { 
         DropDownList ddl = ctrl as DropDownList; 
         ddl.CssClass = "invalid"; 
        } 

        if (ctrl is CheckBox) 
        { 
         CheckBox cb = ctrl as CheckBox; 
         cb.CssClass = "invalid"; 
        } 

        if (ctrl is HtmlGenericControl) 
        { 
         HtmlGenericControl html = ctrl as HtmlGenericControl; 
         html.Attributes.Add("class", className); 
        } 
       } 
      } 
     } 
    } 

} 

的问题是什么,我把这种对净用户控件,我猜是因为我传递页面,page.FindControl(bv.ControlToValidate)总是空。

有没有更好的方法来做到这一点?

回答

1

Page.FindControl不是递归的,它只搜索直接在控件集合中的内容。由于您正在搜索的控件嵌套在UserControl中,因此它将变为null。

您可以看到recursive FindControl function here的版本。

+0

我认为正确的行为需要解决使用validator.NamingContainer.FindControl(...),而不是page.FindControl(...)。在一个页面中可能有几个同名的控件。 – sisve 2012-04-01 08:25:37