Как я могу привести 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"