我有一个GridView (gv
)绑定到一个数据集(ds
)。Columns[1]
与ds
中的orderFilename
绑定;Columns[6]
是一个日期字段。
如果Columns[6]
为空,我希望Columns[1]
显示为文本;如果Columns[6]
不为空,我希望Columns[1]
显示为超链接,url为~/directory/
+ orderFilename
。
我在网上找到了一些可能的解决方案,但似乎没有一个是我想要的。
我更喜欢远离BoundFields
,因为下一个家伙似乎总是需要将它们转换为模板字段,无论如何都要进行自定义。我的建议如下:
为列1使用一个带有Literal
控件的模板字段:
<asp:TemplateField HeaderText="File">
<ItemTemplate>
<asp:Literal ID="ltFilename" runat="server"
OnDataBinding="ltFilename_DataBinding" />
</ItemTemplate>
</asp:TemplateField>
然后为columns控件实现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());
}
}
这样做的好处是您已经将逻辑直接本地化到控件。您可以轻松地将其替换出来并进行更改,而不会意外地影响网格的其他部分。
假设你在column[1]
中添加了一个超链接控件,如果column[6]
不为空,那么你可以设置NavigateURL
属性并设置URL。在这种情况下,它看起来像一个超链接,如果是column[6] is null
,那么你不需要设置URL,因为它会像文本一样。
使用模板列,并在其中放置两个面板。一个面板包含链接,另一个包含文本。试试这样做:
<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建议的那样,是使用超链接,并且仅在Column[6]的DataField不为空时设置URL。