2

好的,我有一个 GridView,如果文件存在,我想有一列作为链接​​,否则我只希望它是一个标签。现在,我正在使用传入参数的 Row 更改 RowDataBound 事件处理程序上的控件。我不是这个的忠实粉丝,因为我对列 ID 进行了硬编码,如果它发生变化,我需要记住更改此代码。如果属性值不为空,我希望我可以在 asp 代码中添加一个链接,否则添加一个标签。这可能吗?有什么不同的解决方案吗?

我想要这样的东西:

<asp:TemplateField HeaderText="Status">
   <ItemTemplate>
    <%# if (Eval("LogFileName") == null)
    <%#{ 
          <asp:LinkButton ID="LogFileLink" runat="server" CommandArgument='<% #Eval("LogFileName") %>' CommandName="DownloadLogFile" Text='<%# Blah.NDQA.Core.Utilities.GetEnumerationDescription(typeof(Blah.NDQA.Core.BatchStatus), Eval("Status")) %>'>
    <%# }
    <%# else
    <%#{
          <asp:Label ID="LogFileLabel" runat="server"Text='<%# Blah.NDQA.Core.Utilities.GetEnumerationDescription(typeof(Blah.NDQA.Core.BatchStatus), Eval("Status")) %>'>
          </asp:Label>
    </ItemTemplate>
</asp:TemplateField>
4

4 回答 4

3

您可以继续使用 RowDataBound 事件,但在您的 aspx 中添加:

<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>

在你的 C# 代码中是这样的:

if (LogFileName) {
  LinkButton ctrl = new LinkButton();
  ctrl.CommandArgument= ...;
  ctrl.CommandName= ...;
} else {
  Label ctrl = new Label();
  ctrl.Text= ...;
}

// You have to find the PlaceHolder1
PlaceHolder1.Controls.Add(ctrl);

通过这种方式,您不必对列 ID 进行硬编码

于 2009-08-26T19:19:22.027 回答
3

我知道这现在有点老了,但以防其他人像我在寻找类似问题的答案时那样偶然发现这个问题,我发现你可以做这样的事情:

<ItemTemplate>                      
    <asp:ImageButton ID="btnDownload" runat="server"
     CommandName="Download"
     CommandArgument='<%# Eval("Document_ID") & "," & Eval("Document_Name") %>'
     ImageUrl="download.png" ToolTip='<%#"Download " & Eval("Document_Name") %>'
     Visible='<%# Not(Eval("Document_ID") = -1) %>' />
</ItemTemplate>

即设置 Visible 属性以根据您的字段评估布尔表达式。如果您想显示某些内容而不是下载链接或按钮,例如“不可用”标签,那么您只需将其 Visible 属性设置为与下载链接相反的布尔表达式。(这是 VB.NET 而不是 C#,但你明白了。)

于 2010-04-16T17:43:11.410 回答
2

使用页面上的属性来确定是要显示标签还是链接

<asp:GridView ID="gv" runat="server">
        <Columns>
            <asp:TemplateField HeaderText="Status">
                <ItemTemplate>
                    <asp:LinkButton runat="server" Visible='<%# ShowLink %>' PostBackUrl="~/Aliases.aspx" >This is the link</asp:LinkButton>
                    <asp:Label runat="server" Visible='<%# ShowLabel %>'>Aliases label</asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

将属性 ShowLink 和 ShowLable 添加到您的代码后面

public bool ShowLabel
    {
        get
        {
            //determine if the label should be shown
            return false;
        }
        private set
        {
            //do nothing
        }
    }
    public bool ShowLink
    {
        get
        {
            //determine if the link should be shown
            return true;
        }
        private set
        {
            //do nothing
        }
    }
于 2009-08-26T19:21:58.200 回答
2

如果您要经常这样做,我建议您编写自己的领域。最简单的方法可能是创建一个从 HyperlinkField 继承的 NullableHyperlinkField,如果锚的 URL 为空,则呈现一个纯字符串。

于 2009-08-26T19:52:59.260 回答