Изменить CSS классы из кода - PullRequest
5 голосов
/ 15 января 2009

Легко установить CssClass в коде позади, но это рискует перезаписать существующие классы.

Мне нужно установить некоторые элементы на ReadOnly = true;, и я хотел бы применить стиль в качестве визуальной подсказки, чтобы элемент не мог быть изменен ... достаточно просто:

.CssClass += " ReadOnlyStyle";

Но иногда мне будет также необходимо изменить тот же элемент на ReadOnly = false;, что означает, что мне нужно будет удалить класс CSS, который я установил, не удаляя другие стили, которые я мог назначить.

Какой лучший способ сделать это?

Ответы [ 7 ]

14 голосов
/ 16 января 2009

Я взял оригинальный код AnthonyWJones и изменил его так, чтобы он работал независимо от сценария:

static class WebControlsExtensions
    {
        public static void AddCssClass(this WebControl control, string cssClass)
        {
            List<string> classes = control.CssClass.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();

            classes.Add(cssClass);

            control.CssClass = classes.ToDelimitedString(" ");
        }

        public static void RemoveCssClass(this WebControl control, string cssClass)
        {
            List<string> classes = control.CssClass.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();

            classes.Remove(cssClass);

            control.CssClass = classes.ToDelimitedString(" ");
        }
    }

    static class StringExtensions
    {
        public static string ToDelimitedString(this IEnumerable<string> list, string delimiter)
        {
            StringBuilder sb = new StringBuilder();
            foreach (string item in list)
            {
                if (sb.Length > 0)
                    sb.Append(delimiter);

                sb.Append(item);
            }

            return sb.ToString();
        }
    }
8 голосов
/ 15 января 2009

В C # 3 вы можете добавить несколько методов расширения.

 static class WebControlsExtensions
 {
     public static void AddCssClass (this WebControl control, string cssClass)
     {
         control.CssClass += " " + cssClass;
     }
     public static void RemoveCssClass (this WebControl control, string cssClass)
     {
         control.CssClass = control.CssClass.replace(" " + cssClass, "");
     }
 }

Использование: -

ctl.AddCssClass("ReadOnly");
ctl.RemoveCssClass("ReadOnly");

Обратите внимание, что RemoveCssClass предназначен для удаления только тех классов, которые были добавлены AddCssClass, и имеет ограничение, заключающееся в том, что при добавлении двух дополнительных имен классов самое короткое имя не должно точно соответствовать началу самого длинного имени. Например, если вы добавили «test» и «test2», вы не можете удалить test без повреждения CssClass. Я думаю, что это может быть улучшено с помощью RegEx, так как приведенное выше будет адекватным вашим потребностям.

Обратите внимание, что если у вас нет C # 3, удалите ключевое слово this из первого параметра и используйте статические методы обычным способом.

2 голосов
/ 26 марта 2013

Связано ... если вы просто хотите переключить класс на основе условия ...

bool disable = true;      // this will vary (true/false) based on UI state

string newClass = disable ? "BtnGray" : "BtnPink";

string currentClass = disable ? "BtnPink" : "BtnGray";

myButton.CssClass = myButton.CssClass.Replace( currentClass, newClass );
1 голос
/ 05 февраля 2013

Pure .NET 2.0 (без расширений! Нет LINQ! Нет RegEx! Нет ненужных классов WebControl!). Эти методы довольно общие, и их следует использовать не только для классов CSS.

public static string AddCssClass(string classContainer, string className)
    {
        if (string.IsNullOrEmpty(classContainer)) return className ?? string.Empty;
        if (string.IsNullOrEmpty(className)) return classContainer;

        var classNames = classContainer.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
        if (Array.Exists(classNames, delegate(string s) { return s.Equals(className); })) return classContainer;

        return classContainer + " " + className;
    }

    public static string RemoveCssClass(string classContainer, string className)
    {
        if (string.IsNullOrEmpty(classContainer)) return className ?? string.Empty;
        if (string.IsNullOrEmpty(className)) return classContainer;

        var classNames = classContainer.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
        int index = Array.FindIndex(classNames, delegate(string s) { return s.Equals(className); });
        if (index >= 0)
        {
            return string.Join(" ", classNames, 0, index) +
                (   index + 1 < classNames.Length ?
                    " " + string.Join(" ", classNames, index + 1, classNames.Length - index - 1)
                    :
                    string.Empty    );
        }

        return classContainer;
    }

    public static string ToggleCssClass(string classContainer, string className)
    {
        if (string.IsNullOrEmpty(classContainer)) return className ?? string.Empty;
        if (string.IsNullOrEmpty(className)) return classContainer;

        var classNames = classContainer.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

        if (Array.Exists(classNames, delegate(string s) { return s.Equals(className); })) return RemoveCssClass(classContainer, className);

        return classContainer + " " + className;
    }
1 голос
/ 18 апреля 2011

Я сделал версию для pre-C # 3:

        public static class WebControlsExtensions
        {
            public static void AddCssClass(WebControl control, string cssClass)
            {
                string[] cssClasses = control.CssClass.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                List<string> classes = new List<string>(cssClasses);

                if (!classes.Contains(cssClass)) {
                    classes.Add(cssClass);
                }

                control.CssClass = StringExtensions.ToDelimitedString(classes, " ");
            }

            public static void RemoveCssClass(WebControl control, string cssClass)
            {
                string[] cssClasses = control.CssClass.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                List<string> classes = new List<string>(cssClasses);

                bool removed = true;
                while (removed) {
                    removed = classes.Remove(cssClass);
                }

                control.CssClass = StringExtensions.ToDelimitedString(classes, " ");
            }
    }
    static class StringExtensions {
        public static string ToDelimitedString(List<string> list, string delimiter)
        {
            StringBuilder sb = new StringBuilder();
            foreach (string item in list) {
                if (sb.Length > 0)
                    sb.Append(delimiter);

                sb.Append(item);
            }

            return sb.ToString();
        }
    }

Используется как:

WebControlsExtensions.AddCssClass(ctl, "classname");
WebControlsExtensions.RemoveCssClass(ctl, "classname");

Этот класс только добавит класс, если его там еще нет. Он также удалит все экземпляры класса (если по какой-то причине их там несколько)

1 голос
/ 15 апреля 2009

Эта версия проверяет, что данный класс еще не добавлен перед добавлением.

public static void CssAddClass(this WebControl control, string className)
{
    var classNames = control.CssClass.Split
        (new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

    if (classNames.Contains(className))
    {
        return;
    }

    control.CssClass = string.Concat
        (classNames.Select(name => name + " ").ToArray()) + className;
}

public static void CssRemoveClass(this WebControl control, string className)
{
    var classNames = from name in control.CssClass.
                         Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries)
                     where name != className
                     select name + " ";


    control.CssClass = string.Concat(classNames.ToArray()).TrimEnd();
}
0 голосов
/ 15 января 2009

Можете ли вы сделать свои собственные классы? Получите из кнопки ASP.NET и добавьте свойство только для чтения. Где-то ... возможно, в OnPreRender, вы можете проверить новое свойство и соответственно установить (или не установить) свойство CSSClass.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...