在代码隐藏中设置CssClass
很容易,但是存在覆盖现有类的风险。
我需要将某些元素设置为ReadOnly = true;
,并且我想将样式应用为视觉提示,该项目无法更改......很简单:
.CssClass += " ReadOnlyStyle";
但有时我也需要将相同的元素更改为ReadOnly = false;
,这意味着我需要删除我设置的CSS类而不删除任何其他样式已分配。
最好的方法是什么?
答案 0 :(得分:14)
我已经采用了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();
}
}
答案 1 :(得分:8)
在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
关键字,并以常规方式使用静态方法。
答案 2 :(得分:2)
相关...如果您只是想根据条件切换一个类......
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 );
答案 3 :(得分:1)
此版本检查以确保在添加之前尚未添加给定的类。
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();
}
答案 4 :(得分:1)
我为前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");
这个只会添加一个类,如果它还没有。它还将删除一个类的所有实例(如果出于某种原因,那里有多个)
答案 5 :(得分:1)
纯.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;
}
答案 6 :(得分:0)
您可以制作自己的自定义课程吗?从ASP.NET按钮派生并为只读添加属性。某处...可能在OnPreRender中,您可以检查新属性并相应地设置(或不设置)CSSClass属性。