2009-08-26 5 views
2

OK Ich habe eine GridView und es gibt eine Spalte, die ich ein Link sein möchte, wenn eine Datei existiert, sonst möchte ich nur, dass es eine Bezeichnung ist. Im Moment ändere ich die Steuerelemente des RowDataBound-Event-Handlers mit der in den Argumenten übergebenen Zeile. Ich bin kein großer Fan davon, da ich die Spalten-ID hart schreibe, und wenn es sich jemals ändert, muss ich daran denken, diesen Code zu ändern. Ich hatte gehofft, ich könnte eine Bedingung im Asp-Code machen, um eine Verbindung hinzuzufügen, wenn ein Eigenschaftswert nicht null ist, andernfalls eine Markierung hinzufügen. Ist das möglich? Irgendwelche verschiedenen Lösungen?ASP.NET GridView ItemTemplate

Ich würde so etwas wie dies mag:

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

Antwort

2

zeigen wollen, Wenn du gehst zu Mache das oft, schlage ich vor, dein eigenes Feld zu schreiben. Der einfachste Ansatz besteht wahrscheinlich darin, ein NullableHyperlinkField von HyperlinkField zu erben und eine einfache Zeichenfolge zu rendern, wenn die URL des Ankers ansonsten null ist.

3

Sie können weiterhin RowDataBound Ereignis verwenden, aber in Ihrem aspx fügen Sie:

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

In Ihrem C# -Code etwas wie folgt aus:

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

Auf diese Weise müssen Sie die Spalte ID

nicht hart codieren
2

Verwenden Eigenschaften auf der Seite, um zu bestimmen, ob Sie die Bezeichnung oder den 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> 

Das fügen Sie die Eigenschaften ShowLink und ShowLable toyour Code hinter

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

Ich habe auch daran gedacht ... nur wollte nicht wirklich Daten zu meinem Modell für die Benutzeroberfläche hinzufügen. – CSharpAtl

3

Ich weiß, das jetzt ein wenig alt, aber nur für den Fall jemand anderes stolpert über diese, wie ich tat, als eine Antwort auf eine ähnliche Frage suchen, fand ich Sie so etwas tun kann:

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

Setzen Sie die Visible-Eigenschaft, um einen booleschen Ausdruck basierend auf Ihrem Feld auszuwerten. Wenn Sie anstelle des Download-Links oder der Schaltfläche etwas anzeigen möchten, z. B. die Beschriftung "Nicht verfügbar", wird die Eigenschaft Sichtbar auf den gegenüberliegenden booleschen Ausdruck für den Download-Link gesetzt. (Dies ist VB.NET nicht C#, aber Sie bekommen die Idee.)