如何将HtmlGenericControl转换为WebControl?

时间:2012-08-23 10:38:12

标签: c# asp.net htmlgenericcontrol

...我正在尝试使用此代码动态添加或删除我的ASP控件的类(我通过我的伟大配对编程朋友发现,他将被称为'G先生')

public static class WebHelper
{
    public static void AddCssClass(this WebControl control, string cssClass) {
        List<string> classes;
        if (!string.IsNullOrWhiteSpace(control.CssClass)) 
        {
            classes = control.CssClass.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();
            if (!classes.Contains(cssClass))
                classes.Add(cssClass);
        }
        else
        {
            classes = new List<string> { cssClass };
        }
        control.CssClass = string.Join(" ", classes.ToArray());
    }

    public static void RemoveCssClass(this WebControl control, string cssClass)
    {
        List<string> classes = new List<string>();
        if (!string.IsNullOrWhiteSpace(control.CssClass))
        {
            classes = control.CssClass.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();
        }
        classes.Remove(cssClass);
        control.CssClass = string.Join(" ", classes.ToArray());
    }
}

不幸的是我无法找到将HtmlGenericControls传递给他们的方法......我已经尝试过显而易见的事了:

WebControl test1 = (WebControl)Page.FindControl("divcontent");
WebHelper.AddCssClass(test1, centredClass);

但我明白了: System.InvalidCastException:无法将类型为“System.Web.UI.HtmlControls.HtmlGenericControl”的对象强制转换为“System.Web.UI.WebControls.WebControl”。

我仍然对C#,Visual Studio等缺乏经验,因为我的背景是Ye Olde Pick BASIC,所以请简单解释我是如何投射我的控件,或者修改代码以便它能够实现最终目标添加或删除类而不会丢失任何现有类。

非常感谢!罗斯

2 个答案:

答案 0 :(得分:4)

你的朋友课错了。 WebHelper中的方法是扩展方法,因此它应如下所示:

WebControl test1 = (WebControl)Page.FindControl("divcontent");
test1.AddCssClass("something");

(验证它有效)。确保您的控件来自WebControl并且设置了runat="server"

编辑:修改了WebHelper以支持HtmlControls

public static class WebHelper
{
    public static void AddCssClass(this HtmlControl control, string cssClass)
    {
        List<string> classes;
        if (!string.IsNullOrWhiteSpace(control.Attributes["class"]))
        {
            classes = control.Attributes["class"].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();
            if (!classes.Contains(cssClass))
                classes.Add(cssClass);
        }
        else
        {
            classes = new List<string> { cssClass };
        }
        control.Attributes["class"] = string.Join(" ", classes.ToArray());
    }

    public static void RemoveCssClass(this HtmlControl control, string cssClass)
    {
        List<string> classes = new List<string>();
        if (!string.IsNullOrWhiteSpace(control.Attributes["class"]))
        {
            classes = control.Attributes["class"].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();
        }
        classes.Remove(cssClass);
        control.Attributes["class"] = string.Join(" ", classes.ToArray());
    }

    public static void AddCssClass(this WebControl control, string cssClass)
    {
        List<string> classes;
        if (!string.IsNullOrWhiteSpace(control.CssClass))
        {
            classes = control.CssClass.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();
            if (!classes.Contains(cssClass))
                classes.Add(cssClass);
        }
        else
        {
            classes = new List<string> { cssClass };
        }
        control.CssClass = string.Join(" ", classes.ToArray());
    }

    public static void RemoveCssClass(this WebControl control, string cssClass)
    {
        List<string> classes = new List<string>();
        if (!string.IsNullOrWhiteSpace(control.CssClass))
        {
            classes = control.CssClass.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();
        }
        classes.Remove(cssClass);
        control.CssClass = string.Join(" ", classes.ToArray());
    }
}

根据需要随意修改代码。一切都保持不变,只是添加了HtmlControl的扩展方法,因为如果你想修改一个HtmlControl类,你需要使用control.Attributes["class"],因为没有CssClass属性。希望它有所帮助!

答案 1 :(得分:0)

使用asp:Panel divcontent代替div runat="server"