如何将BoundField转换为HyperLinkField?

时间:2011-08-19 16:46:34

标签: c# asp.net gridview hyperlink boundfield

我有一个绑定到数据集(gv)的GridView(ds)。 Columns[1]绑定到ds中名为orderFilename的字段; Columns[6]是日期字段。

如果Columns[6]为空,我希望Columns[1]显示为文字;如果Columns[6]不为空,我希望Columns[1]显示为超链接,并带有网址~/directory/ + orderFilename

我在网上找到了几个可能的解决方案,但似乎没有一个能做到我想要的。任何帮助将不胜感激。

3 个答案:

答案 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。