1

System.Web.UI.WebControls.Table/Cell/Rowから派生して遊んでいますが、HtmlTextWriter.AddAttributeを機能させることができません。

テーブル:

public class Table : System.Web.UI.WebControls.Table
{
    public string Title { get; set; }
    public bool Sorted { get; set; }

    public Table()
    {
    }
}

テーブルヘッダー行:

public class TableHeaderRow : System.Web.UI.WebControls.TableHeaderRow
{
    public TableHeaderRow()
    {
        this.TableSection = TableRowSection.TableHeader;
        this.ClientIDMode = System.Web.UI.ClientIDMode.Static;
    }
}

テーブルヘッダーセル:

public class TableHeaderCell : System.Web.UI.WebControls.TableHeaderCell
{
    public TableHeaderCell()
    {
    }

    public override void RenderBeginTag(HtmlTextWriter writer)
    {
        AddAttributesToRender(writer);
        writer.AddAttribute("test", "whee");
        writer.WriteBeginTag("th");
        //writer.WriteAttribute("test", "whee");
        writer.WriteLine('>');
    }

    public override void RenderEndTag(HtmlTextWriter writer)
    {
        writer.WriteEndTag("th");
        writer.WriteLine();
    }
}

利用方法:

    <Internal:Table ID="somethingTbl" runat="server" Title="A Table" Sorted="true">
        <Internal:TableHeaderRow>
            <Internal:TableHeaderCell>
                Stuff
            </Internal:TableHeaderCell>
            <Internal:TableHeaderCell>
                More Stuff
            </Internal:TableHeaderCell>
            <Internal:TableHeaderCell>
                Less Stuff
            </Internal:TableHeaderCell>
        </Internal:TableHeaderRow>
    </Internal:Table>

そして、いくつかの通常の行がcsに追加されます。次の部分的な出力が得られます。

    <table id="activationsTbl">
<thead>
    <tr>
        <th>

                Stuff
            </th>
        <th>

                More Stuff
            </th>
        <th>

                Less Stuff
            </th>
    </tr>
</thead><tbody test="whee" test="whee" test="whee">
...

ご覧のとおり、属性は、すべてのthタグ(最後のtbodyタグ)の次の開始タグで書き出されています。コメントアウトされたWriteAttributesを使用すると、正しく書き込まれます。他の行がない場合(したがって、行がない場合<tbody>)、属性は他のタグに書き込まれません。

4

2 に答える 2

1

そして数分後、WriteBeginTagとRenderBeginTag *facepalm*の間に違いがあることに気付きました。

于 2012-10-04T21:50:20.163 に答える
1

これは、軽量でアプリケーションに合わせて調整されたカスタムコントロールの例です。これは、すべてのプロジェクトで使用する基本カスタムコントロールから継承しますが、基本クラスはSystem.Web.UI.Controlです。これは、表示できないオーバーヘッドとコードがあり、場合によってはボックス化できる他のWebControlからの継承を使用することをお勧めします。であなた。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Solution.Data.Portfolio;
using Solution.Web.Data.Portfolio;

namespace Solution.Web.UI.Portfolio
{
    public class ClientIconListControl : UI.Control
    {
        private PortfolioSystem Portfolio { get { return ((iPortfolioControl)Parent).PortfolioSystem; } }

        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);

            Page.HeadJQueryOnLoadGeneralRendering += new Deployment.Web.UI.Head.AdditionalRenderingHandler(Page_HeadJQueryOnLoadGeneralRendering);
        }

        void Page_HeadJQueryOnLoadGeneralRendering(System.Web.UI.HtmlTextWriter writer)
        {
            if (this.Visible)
            {
                foreach (KeyValuePair<string, Client> c in this.Portfolio.Clients)
                {
                    writer.WriteLine("gPortfolio.RegisterClientIcon('{2}_{0}_container', {1}, '{0}');", c.Key, c.Value.SpriteIconIndex * 183, this.ClientID);
                }
            }
        }

        protected override void Render(System.Web.UI.HtmlTextWriter writer)
        {
            if (this.Visible)
            {
                string sImageSpacerPath = Page.ResolveUrl("~/ui/image/spacer.gif");
                writer.Indent = 2;
                foreach (KeyValuePair<string, Client> c in this.Portfolio.Clients)
                {
                    if (c.Value.Projects.Count > 0)
                    {
                        writer.WriteLine("<div id=\"{1}_{0}_container\" class=\"icon\">", c.Key, this.ClientID);
                        writer.Indent++;
                        writer.Write("<img id=\"{4}_{3}\" src=\"{0}\" alt=\"{1}\" class=\"{2}\" />", sImageSpacerPath, c.Value.Title, "spwi", c.Key, this.ClientID);
                        writer.WriteLine();
                        writer.WriteLine("<div class=\"hover\">");
                        writer.Indent++;
                        writer.WriteLine("<img src=\"{0}\" alt=\"\" class=\"spwi spwi_overlay\" />", sImageSpacerPath);
                        writer.WriteLine("<h3>{0}</h3><p>{1}</p>", c.Value.Title, String.Empty);
                        writer.Indent--;
                        writer.WriteLine("</div>");
                        writer.Indent--;
                        writer.WriteLine("</div>");
                    }
                }
            }
        }
    }
}

より大きなプロジェクト/ソリューションに基づく関数のいくつかを見落とす必要がありますが、Render関数をオーバーライドするだけで、RenderBeginTagなどをいじることなくコントロールをカスタマイズできます。

あなたの問題に対する答えではありませんが、コントロールを作成するときに考慮すべきことがあります。作成には約10分かかりました。計画外の変更があった場合でも、必要に応じて変更するための完全な制御が可能であり、より堅牢な制御の範囲内で作業する必要はありません。

于 2012-10-08T22:54:03.253 に答える