2012-11-08 118 views
1

我有兩種類型的代碼: 1:動態添加超鏈接的GridView

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

工程正常。但是每次都會顯示TemplateField。

第二

  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'。爲什麼在第一次添加HyperLink時,第二次沒有?

+0

您能否描述一下使用gridview實現的需求? –

回答

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); 
    } 
} 

請注意,您不能設置從InstantiateInNavigateUrlText。你只能創建控件。您可以根據行的DataItem將數據綁定到RowDataBound

但是

Although you can dynamically add fields to a data-bound control, it is strongly recommended that fields be statically declared and then shown or hidden, as appropriate. Statically declaring all your fields reduces the size of the view state for the parent data-bound control.

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

+0

您只需更改該列的「可見」屬性。例如:'tableResults.Columns [0] .Visible = false;'如果你想隱藏第一列。 –

0

templField.InsertItemTemplate期望一個ITemplate對象,其中作爲超鏈接不延伸此接口。

在您的第一個聲明性示例中,超鏈接是主機ItemTemplate,它擴展了此接口ITemplate