2016-08-02 10 views
-1

Ich habe eine DetailsView, die Vorlagenfelder verwendet. Was ich möchte, ist, wenn ein Feldwert "FTP" ist, zeigt es die Felder an, die sich auf FTP beziehen, andernfalls zeigt es die Felder an, die sich auf SFTP beziehen.So können Sie Vorlagenfelder in DetailsView dynamisch ausblenden

Ich habe die SO Frage und Antwort here gelesen. Es scheint jedoch nicht zu funktionieren. Ich habe versucht, die Variable zu ändern, bevor und nachdem ich meine DetailsView databind. Könnte jemand darauf hinweisen, was ich falsch mache?

Auch ich muss dies mit ungefähr 20 Feldern auf dieser Seite allein tun, also versuche ich, die jemals komplexe Schleifenstruktur mit FindControl() zu vermeiden.

Hier ist ein Teil meines Codes.

<ItemTemplate> 
    <asp:Label ID="REPRESENTATION_TYPELBL" runat="server" Visible='<%# showFTP %>' 
     Text='<%# Bind("REPRESENTATION_TYPE") %>'></asp:Label> 
</ItemTemplate> 

-Code Behind:

protected bool showFTP = false; // Tried initializing as class variable 
protected bool showSFTP; // and also not initializing 
protected void Page_Load(object sender, EventArgs e) 
    { 
     ChooseFTPDisplay("SFTP"); // Tried setting it in Page_Load and not in Page_Load 
    } 
protected void FTPGetBind() 
    { 
     if (FTPLookupDDL.SelectedIndex != 0) 
     { 
      DataTable tbl = BL.GetFTPRow("FTPLookUpID"); // data retrieval 
      //ChooseFTPDisplay((string)tbl.Rows[0]["FTP_MODE"]); // tried here 
      FTPGetView.DataSource = tbl; 
      FTPGetView.DataBind(); 
      ChooseFTPDisplay((string)tbl.Rows[0]["FTP_MODE"]); // tried here 

     } 
    } 
private void ChooseFTPDisplay(string mode) 
    { 
     if (mode == "FTP") 
     { 
      showFTP = true; 
      showSFTP = false; 
     } 
     else // Could be null or "SFTP" 
     { 
      showFTP = false; 
      showSFTP = true; 
     } 
    } 

EDIT

Ich habe jetzt dies auch versucht:

<ItemTemplate> 
    <asp:Label ID="REPRESENTATION_TYPE" runat="server" Visible='<%# (string)Eval("FTP_MODE") == "FTP" ? true: false%>' 
    Text='<%# Bind("REPRESENTATION_TYPE") %>'></asp:Label> 
</ItemTemplate> 

UPDATE

Ich habe nicht genug Informationen zur Verfügung gestellt. Ich möchte das gesamte Feld verstecken. Dazu gehören die Kopfzeile, Element/Bearbeiten/Vorlage einfügen und alle untergeordneten Steuerelemente. Was ich oben habe funktioniert, um einzelne Steuerelemente zu verstecken, aber nicht das gesamte Feld. Leider , ich kann nicht einfach tun:

<TemplateField Visible='<%# boolValue %>' >...Stuff...</TemplateField> 

weil Template nicht bindable.

Grundsätzlich möchte ich das Äquivalent von:

DetailsView1.Fields[15].Visible = false;// 15 is the index of the field I want hidden 

auf die effizienteste und skalierbare Art, wie ich es tun kann. Diese Form wird sich sicherlich in der Zukunft ändern, und ich möchte nicht, dass jemand zurückgehen muss und den Index aller 20+ Felder herausfinden muss, die dynamisch gezeigt oder versteckt werden müssen.

+0

Was meinst du genau mit "es scheint nicht zu funktionieren"? Welches Ergebnis bekommst du? – ConnorsFan

+0

Es zeigt nur alle Felder unabhängig vom booleschen Wert an. –

Antwort

1

Haben Sie einen Blick auf das Beispiel below.I eine einfache Klasse mit drei Feldern schrieb:

  • Typ
  • IP
  • Hafen

Wenn man sich IP und Port Felder Sie werden feststellen, dass ich Ausdrücke auf die Visible Eigenschaft dieser Felder geschrieben habe, um zu überprüfen, ob die Type FTP oder SFTP ist, dies zeigt oder verbirgt das Etikett entsprechend.

.ASPX:

<asp:DetailsView AutoGenerateRows="false" ID="detailsView" runat="server" AllowPaging="True" OnPageIndexChanging="detailsView_PageIndexChanging"> 
      <Fields> 
       <asp:TemplateField> 
        <ItemTemplate> 
         <asp:Label runat="server" Text='<%# Eval("Type") %>' /> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField> 
        <ItemTemplate> 
         <asp:Label runat="server" Text='<%# Eval("IP") %>' Visible='<%# Eval("Type") == "FTP" ? true : false %>' /> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField> 
        <ItemTemplate> 
         <asp:Label runat="server" Text='<%# Eval("Port") %>' Visible='<%# Eval("Type") == "SFTP" ? true : false %>' /> 
        </ItemTemplate> 
       </asp:TemplateField> 
      </Fields> 
     </asp:DetailsView> 

-Code hinter:

public partial class DetailsViewWithConditionalColumns : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if(!Page.IsPostBack) 
      this.BindData(); 
    } 

    private void BindData() 
    { 
     var ftp1 = new FTPDetails { Type = "FTP", IP = "1.1.1.1", Port = "21" }; 
     var ftp2 = new FTPDetails { Type = "SFTP", IP = "2.2.2.2", Port = "22" }; 

     detailsView.DataSource = new List<FTPDetails> { ftp1, ftp2 }; 
     detailsView.DataBind(); 
    } 

    protected void detailsView_PageIndexChanging(object sender, DetailsViewPageEventArgs e) 
    { 
     detailsView.PageIndex = e.NewPageIndex; 
     this.BindData(); 
    } 
} 

public class FTPDetails 
{ 
    public string Type { get; set; } 
    public string IP { get; set; } 
    public string Port { get; set; } 
} 
+0

Es zeigt immer noch alle Felder an. Könnte es damit zusammenhängen, wenn die Detailansicht gebunden ist? –

+0

Haben Sie in Ihrer Datenquelle eine Eigenschaft mit dem Namen Type, die Werte "FTP" oder "SFTP" hat? Ich habe den Code nur als Beispiel geschrieben, ich weiß nicht, wie Sie Ihre Eigenschaften benannt haben der Code oben als Richtlinie und passen Sie es entsprechend Ihren Bedürfnissen an –

+0

Vor der Verwendung habe ich "Typ" zu etwas bedeutungsvoll zu meinen Daten geändert. Ich werde meine Frage aktualisieren. –

0

Wenn jemand ein ähnliches Problem hat, das ist, wie ich die Felder versteckte ich versteckte benötigt. Mir ist klar, dass dies mit ziemlicher Sicherheit nicht der beste Weg ist, aber es funktioniert.

Was ich getan habe, war einige boolesche Variablen für jede Gruppe von Feldern, die bedingt sichtbar waren. Dann würde jedes Mal, wenn der Radiobutton angeklickt wurde, die boolesche Variable entsprechend geändert werden. Ich benutzte die TemplateFields SortExpression, um die Felder zu gruppieren, die zusammen sein mussten.

<asp:TemplateField HeaderText="SFTP_KNOWNHOST_KEY_ID *" 
         SortExpression="SFTP"> 
    // Stuff goes here 
</asp:TemplateField> 
<asp:TemplateField HeaderText="REPRESENTATION_TYPE 
         SortExpression="FTP_FIELD"> 
    // Stuff goes here 
</asp:TemplateField> 
<asp:TemplateField HeaderText="FTPS_CACERTIFICATE_ID 
         SortExpression="FTPS"> 
    // Stuff goes here 
</asp:TemplateField> 


private static bool showFTP, showSFTP, showFTPS; 

protected void FTP_MODEBtns_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    string mode = FTP_MODEBtns.SelectedValue; 
    if (mode == "FTP") 
     { 
      showFTP = true; 
      showSFTP = false; 
      showFTPS = false; 
     } 
     else 
     { 
      showFTP = false; 
      showSFTP = true; 
      showFTPS = false; 
     } 
    SetVisibility(); 
} 

static internal void SetVisibility() 
    { 

     foreach (DataControlField f in FTPView.Fields) 
     { 
      string htext = f.SortExpression; 
      if (htext.Contains("SFTP")) 
       f.Visible = showSFTP; 
      else if (htext.Contains("FTP_FIELD")) 
       f.Visible = showFTP; 
      else if (htext.Contains("FTPS")) 
       f.Visible = showFTPS;     
     } 
    }