ASP.NET GridView ItemTemplate

OK I have a GridView and there is a column that I want to be a reference if the file exists, otherwise I just want it to be a label. I am currently changing the controls on the RowDataBound event handler using the string passed to args. I'm not a big fan of this as I am hard-coding the column ID and if it ever changes I will need to remember this code. I was hoping I could make a condition in the asp code to add a link if the property value is not null, otherwise add a label. Is it possible? Any different solutions?

I would like something like this:

<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>

      

+2


source to share


4 answers


If you are going to do this a lot, I suggest writing your own field. The simplest approach is probably to make the NullableHyperlinkField inherit from HyperlinkField and display a simple string if the anchor url would otherwise be null.



+2


source


You can keep using the RowDataBound event, but in your aspx you add:

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

      

In C # code, something like this:



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

      

This way you don't have to hardcode the column id

+3


source


I know this is a bit old-fashioned now, but just in case someone stumbled upon this, as I did when looking for an answer to a similar question, I found that you can do something like this:

<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>

      

i.e. set the Visible property to evaluate a boolean expression based on your field. If you want to display something instead of a download link or button, such as the Not Available label, then you simply set your Visible property to the opposite boolean expression in the download link. (This is VB.NET not C #, but you get the idea.)

+3


source


Use properties on the page to determine if you want to display a shortcut or link

<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>

      

Add ShowLink and ShowLable properties to your code below

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
        }
    }

      

+2


source