从代码中更改CSS类

在代码隐藏中设置CssClass很容易,但是存在覆盖现有类的风险。

我需要将某些元素设置为ReadOnly = true; 而且我想将一种风格作为视觉提示,使该项目无法改变……很容易:

 .CssClass += " ReadOnlyStyle"; 

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

最好的方法是什么?

我已经采用了AnthonyWJones的原始代码并对其进行了修改,以便无论在何种情况下它都能正常工作:

 static class WebControlsExtensions { public static void AddCssClass(this WebControl control, string cssClass) { List 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 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 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(); } } 

在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关键字,并以常规方式使用静态方法。

相关…如果您只想根据条件切换类…

 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 ); 

此版本检查以确保在添加之前尚未添加给定的类。

 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(); } 

我为前C#3制作了一个版本:

  public static class WebControlsExtensions { public static void AddCssClass(WebControl control, string cssClass) { string[] cssClasses = control.CssClass.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); List classes = new List(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 classes = new List(cssClasses); bool removed = true; while (removed) { removed = classes.Remove(cssClass); } control.CssClass = StringExtensions.ToDelimitedString(classes, " "); } } static class StringExtensions { public static string ToDelimitedString(List 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"); 

这个只会添加一个类,如果它还没有。 它还将删除一个类的所有实例(如果出于某种原因,那里有多个)

纯.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; } 

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