我有两种类型的代码: 第一:
<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 :(得分: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
内设置Text
或InstantiateIn
。在那里你只创建控件。您可以根据行RowDataBound
在DataItem
中对其进行数据绑定。
<强>但是强>:
虽然您可以动态地将字段添加到数据绑定控件,但它是 强烈建议将字段静态声明然后显示 或隐藏,视情况而定。静态地声明你所有的领域 减少父数据绑定控件的视图状态的大小。
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.templatefield.templatefield.aspx
答案 1 :(得分:0)
templField.InsertItemTemplate
需要一个ITemplate
对象,其中超链接不会扩展此接口。
在您的第一个声明性示例中,超链接是ItemTemplate
的主机,它扩展了此接口ITemplate
。