2

ASCXファイルに以下を含むユーザーコントロールを作成したいと思います。

...
<tr runat="server" ID="mytr">
    <td runat="server" ID="myCell1"></td>
    <asp:PlaceHolder runat="server" ID="myPlaceholder"></asp:PlaceHolder>
    <td runat="server" ID="myCell2"></td>
</tr>
...

これにより、次のエラーが生成されます。

System.Web.UI.HtmlControls.HtmlTableCellCollectionには、「System.Web.UI.HtmlControls.HtmlTableCell」タイプのアイテムが必要です。「asp:PlaceHolder」のタイプは「System.Web.UI.WebControls.PlaceHolder」です。

その理由は、PlaceHolderそのセルを動的に生成したいからです(たとえば、との間TDを選択THしたり、セルを作成するかどうかを選択したりします)。

これを行う簡単な方法はありますか?それとも、継承する独自のカスタムコントロールを作成する必要がありますHtmlTableCellか?

特定のテーブル要素のビューステートが序数(子コントロールコレクションへのインデックス)によってキー設定されていることに気付きました。つまり、セルを動的に生成できない場合もあります。これに関する一般的なベストプラクティスはありますか?

また、常にTDを作成することも検討しましたが、それを非表示にするだけです。問題はrowspan、前の行で使用することです。つまり、行が異なれば、セルの数も異なります。これは条件付きであり、ポストバック間で変更できます(行を有効/無効にすることにより)。

4

4 に答える 4

1

ASP.net Table Webcontrolを使用して、テーブルを動的に作成できます(コードからテーブル全体を生成することを検討している場合)。

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.table.aspx

于 2012-07-09T14:10:08.240 に答える
1

これを回避する方法はいくつかあります。

1.およびタグrunat="server"から属性を削除します。この方法の欠点は、サーバー側からこれらのタグを変更できないことです。ただし、タグは引き続き変更できます。tabletrtd

2.サーバー側のコードからテーブル全体を動的に生成します。

HTML

<table runat="server" id="Table1">
</table>

C#サーバー側コード

HtmlTableRow row = new HtmlTableRow();
HtmlTableCell cell = new HtmlTableCell();
cell.InnerText = "Text goes here.";
row.Cells.Add(cell);

this.Table1.Rows.Add(row);
于 2012-07-09T14:18:22.337 に答える
0

簡単なカスタムコントロールを作成することで、なんとか解決できました。

public class HtmlTableCellPH : HtmlTableCell
{
    public HtmlTableCellPH()
    {
    }

    public HtmlTableCellPH(string tagName)
        : base(tagName)
    {
    }

    public override void RenderControl(HtmlTextWriter writer)
    {
        this.RenderChildren(writer);
    }
}

そして今、ascxは次のとおりです。

...
<tr runat="server" ID="mytr">
    <td runat="server" ID="myCell1"></td>
    <ns:HtmlTableCellPH runat="server" ID="myPlaceholder"></ns:HtmlTableCellPH>
    <td runat="server" ID="myCell2"></td>
</tr>
...
于 2012-07-09T14:25:08.340 に答える
0

これに遭遇したときに使用する解決策は、をに置き換えて<tr><asp:literal>テーブル行のHTMLを自分で作成することです。

例:

<asp:literal runat="server" ID="trRow" Mode="PassThrough" />
    <td runat="server" ID="myCell1"></td>
    <asp:PlaceHolder runat="server" ID="myPlaceholder"></asp:PlaceHolder>
    <td runat="server" ID="myCell2"></td>
</tr>

次に、背後のコードで

Literal trRow = (Literal)e.Item.FindControl("trRow");
// ... some code here decides on CSS class I want to use
trRow.Text = string.Format("<tr class=\"{0}\">", strCssClass);
于 2018-12-12T17:47:58.117 に答える