1

... このコードを使用して、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' にキャストできません。

私のバックグラウンドは Ye Olde Pick BASIC であるため、C# や Visual Studio などにはまだ比較的慣れていません。追加または削除できるという最終目標を達成するために、コントロールをキャストする方法、またはコードを修正する方法を簡単に説明してください。既存のクラスを失うことなくクラス。

どうもありがとう!ロス

4

2 に答える 2

5

友達のクラスを間違って使用しています。WebHelper のメソッドは拡張メソッドであるため、次のようになります。

WebControl test1 = (WebControl)Page.FindControl("divcontent");
test1.AddCssClass("something");

(動作確認済み)。WebControlコントロールが派生し、設定されていることを確認してくださいrunat="server"

編集:HtmlControlsもサポートするようにWebHelperを変更

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それが役に立てば幸い!

于 2012-08-23T10:47:51.143 に答える
0

の代わりにasp:Panelコントロールを使用するdivcontentdiv runat="server"

于 2012-08-23T11:18:53.450 に答える