3

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

如果Columns[6]为空,我想Columns[1]显示为文本;如果Columns[6]不为空,我想Columns[1]显示为带有 url ~/directory/+的超链接orderFilename

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

4

3 回答 3

4

我更喜欢远离BoundFields特别是因为下一个人似乎总是需要将它们转换为模板字段来进行自定义。我会推荐以下内容:

为您的第 1 列使用带有Literal控件的模板字段:

<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());
    }
}

这样做的好处是您已将逻辑直接本地化到控件。您可以轻松地将其换出并进行更改,而不会意外影响网格的其他部分。

于 2011-08-19T17:11:14.693 回答
1

假设您在 中添加了一个超链接控件column[1],如果column[6]不为空,则可以设置NavigateURL属性并设置 URL。在这种情况下,它看起来像一个超链接,如果是column[6] is null,那么您不需要设置 URL,因为它的行为类似于文本。

于 2011-08-19T16:52:02.213 回答
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 所建议的那样,另一个选项是无论如何都使用超链接,并且仅在 Column[6] 的 DataField 不为空时才设置 URL。

于 2011-08-19T16:56:44.577 回答