如何将BoundField转换为HyperLinkField



我有一个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。

相关内容

  • 没有找到相关文章

最新更新