2012-11-08 84 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