我有一个绑定到数据集(gv
)的GridView(ds
)。 Columns[1]
绑定到ds
中名为orderFilename
的字段; Columns[6]
是日期字段。
如果Columns[6]
为空,我希望Columns[1]
显示为文字;如果Columns[6]
不为空,我希望Columns[1]
显示为超链接,并带有网址~/directory/
+ orderFilename
。
我在网上找到了几个可能的解决方案,但似乎没有一个能做到我想要的。任何帮助将不胜感激。
答案 0 :(得分:4)
我更倾向于远离BoundFields
,因为下一个人似乎总是将它们转换为模板字段,无论如何都要进行自定义。我建议如下:
使用带有Literal
控件的模板字段作为第1列:
<asp:TemplateField HeaderText="File">
<ItemTemplate>
<asp:Literal ID="ltFilename" runat="server"
OnDataBinding="ltFilename_DataBinding" />
</ItemTemplate>
</asp:TemplateField>
然后为列控件实现OnDataBinding
:
protected void ltFilename_DataBinding(object sender, System.EventArgs e)
{
Literal lt = (Literal)(sender);
if (Eval("yourColumn6Field") == DBNull.Value)
{
// just show a text filename
lt.Text = Eval("orderFilename").ToString();
}
else
{
// produce the link
lt.Text = string.Format("<a href='{0}'>{1}</a>",
ResolveUrl("~/directory/" + Eval("orderFilename").ToString()),
Eval("orderFilename").ToString());
}
}
这样做的好处是您已将逻辑直接本地化到控件。您可以轻松地将其更换并进行更改,而不会意外地影响网格的其他部分。
答案 1 :(得分:1)
假设您已在column[1]
中添加了超链接控件,如果column[6]
不为null,则可以设置NavigateURL
属性并设置URL。在这种情况下,它看起来像一个超链接,如果是column[6] is null
,那么你不需要设置URL,因为它的行为就像文本一样。
答案 2 :(得分:0)
使用模板列,并在其中放置两个面板。一个面板包含链接,另一个面板包含文本。尝试这样的事情:
<asp:TemplateField>
<ItemTemplate>
<asp:Panel ID="pnlLink" runat="server" Visible='<%#Eval("SomeColumn") != null%>'>
<asp:HyperLink ... ></asp:HyperLink>
</asp:Panel>
<asp:Panel ID="pnlLink" runat="server" Visible='<%#Eval("SomeColumn") = null%>'>
<%#Eval("SomeColumn")%>
</asp:Panel>
</ItemTemplate>
</asp:TemplateField>
另一个选项,正如@Muhammad Akhtar所建议的那样,无论如何都要使用超链接,只有当DataField for Column [6]不为空时才设置URL。