1

私は2つのタイプのコードを持っています:1番目:

               <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:HyperLink runat="server" Text="Скачать объект" NavigateUrl='<%#"objects/" + Eval("Идентификатор") %>'></asp:HyperLink>
                    </ItemTemplate>    
                </asp:TemplateField>
               </Columns>

正常に動作します。しかし、TemplateFieldは毎回表示されました。

2位

            TemplateField templField = new TemplateField();
            HyperLink hypLink = new HyperLink();
            hypLink.NavigateUrl = "<%#\"objects/\" + Eval(\"Идентификатор\") %>";
            hypLink.Text = "Скачать объект";
            templField.InsertItemTemplate = (ITemplate)hypLink;
            tableResults.Columns.Add(templField);

エラーで動作しません:タイプ「System.Web.UI.WebControls.HyperLink」のオブジェクトをタイプ「System.Web.UI.ITemplate」にキャストできません。なぜ1回目でHyperLinkが追加されたのに、2回目では追加されなかったのですか?

4

2 に答える 2

2

これは始めるのに役立つかもしれません:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    { 
        var hyperlinkField = new TemplateField();
        hyperlinkField.ItemTemplate = new HyperlinkColumn();
        tableResults.Columns.Add(linkField);
    }
}


class HyperlinkColumn : ITemplate
{
    public void InstantiateIn(System.Web.UI.Control container)
    {
        HyperLink hypLink = new HyperLink()
        container.Controls.Add(link);
    }
}

内からNavigateUrlまたはを設定することはできませんのでご注意ください。そこでは、コントロールを作成するだけです。行のに応じてデータバインドします。TextInstantiateInRowDataBoundDataItem

しかし

データバインドコントロールにフィールドを動的に追加できますが、 フィールドを静的に宣言してから、必要に応じて表示または非表示にすることを強くお勧めします。すべてのフィールドを静的に宣言すると、親データバインドコントロールのビューステートのサイズが小さくなります。

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

于 2012-11-08T11:34:18.203 に答える
0

templField.InsertItemTemplateITemplateハイパーリンクがこのインターフェイスを拡張しないオブジェクトを想定しています。

最初の宣言型の例では、ハイパーリンクはItemTemplateこのインターフェイスを拡張するホストですITemplate

于 2012-11-08T11:35:02.380 に答える