代码之家  ›  专栏  ›  技术社区  ›  nailitdown

从代码中更改CSS类

  •  5
  • nailitdown  · 技术社区  · 16 年前

    很容易设置 CssClass 在代码后面,但这有覆盖现有类的风险。

    我需要设置某些元素 ReadOnly = true; 我想应用一种风格作为视觉提示,表明该项目不能更改。..很简单:

    .CssClass += " ReadOnlyStyle";
    

    但有时我会 而且 需要将相同的元素更改为 ReadOnly = false; 这意味着我需要删除我设置的CSS类,而不删除我可能分配的任何其他样式。

    最好的办法是什么?

    7 回复  |  直到 8 年前
        1
  •  14
  •   John_    16 年前

    我采用了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();
            }
        }
    
        2
  •  8
  •   AnthonyWJones    16 年前

    在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添加的类,并且有一个限制,即添加2个额外类名时,最短名称不应与最长名称的开头完全匹配。例如,如果您添加了“test”和“test2”,则无法在不损坏CssClass的情况下删除测试。通过RegEx可以改进这一点,我希望上述内容足以满足您的需求。

    注意,如果你没有C#3,那么删除 this 从第一个参数中提取关键字,并以传统方式使用静态方法。

        3
  •  2
  •   nsgulliver    12 年前

    相关。..如果你只是想根据条件切换一个类。..

    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 );
    
        4
  •  1
  •   core    16 年前

    此版本在添加给定类之前会进行检查,以确保尚未添加该类。

    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();
    }
    
        5
  •  1
  •   Hewins    14 年前

    我为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");
    

    这个只会添加一个尚未存在的类。它还将删除一个类的所有实例(如果由于某种原因,其中有多个实例)

        6
  •  1
  •   Evgeni Nabokov    7 年前

    纯净。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;
        }
    
        7
  •  0
  •   Al W    16 年前

    你能自己定制课程吗?源自ASP。NET按钮,并为只读添加一个属性。某处。..可能在OnPreRender中,您可以检查新属性并相应地设置(或不设置)CSSClass属性。

    推荐文章