Как я могу привести HtmlGenericControl в качестве WebControl?

... Я пытаюсь динамически добавлять или удалять классы в моих элементах управления ASP, используя этот код (который я нашел через моего замечательного друга по парному программированию, который будет известен как 'Mr 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 ответа

Решение

Вы используете класс своих друзей неправильно. Методы в вашем 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 приписывать. Надеюсь, поможет!

Использование asp:Panel контроль за divcontent вместо div runat="server"

Другие вопросы по тегам