2016-08-02 72 views
-1

我有一個使用模板字段的DetailsView。我希望發生的情況是,當字段值爲「FTP」時,它將顯示與FTP相關的字段,否則顯示與SFTP相關的字段。如何動態地隱藏DetailsView中的模板字段

我已閱讀並且回答here。但是,它似乎並沒有工作。我試圖改變變量之前和之後我databind我的DetailsView。有人能指出我做錯了什麼嗎?

另外,我需要在這個頁面上單獨使用大約20個字段來完成此操作,所以我試圖避免使用FindControl()的複雜循環結構。

這是我的一些代碼。

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

代碼背後:

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

編輯

現在我已經試過這還有:

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

UPDATE

我沒有提供足夠的信息。我想隱藏整個Field。包括標題,項目/編輯/插入模板和任何子控件。我上面的內容隱藏了單個控件而不是整個字段。 不幸的是,我不能做到這一點:

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

,因爲模板列不綁定。

基本上,我想等價的:

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

以最有效的和可擴展的方式我可以做到這一點。這種形式在未來幾乎肯定會發生變化,我不希望有人必須回頭找出需要動態顯示或隱藏的所有20多個字段的索引。

+0

什麼意思是「它似乎並沒有工作」?你會得到什麼結果? – ConnorsFan

+0

它只顯示所有的字段,不管布爾值如何。 –

回答

1

看一看的例子below.I寫了一個簡單的類有三個字段:

  • 類型
  • IP
  • 端口

如果你看一下IP和端口字段您會注意到我在這些字段的Visible屬性上編寫了表達式來檢查Type是FTP還是SFTP,這會相應地顯示或隱藏標籤。

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

後面的代碼:

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

它仍然顯示所有字段。它可能與詳細視圖何時綁定有關嗎? –

+0

在數據源中是否有一個名爲Type的屬性,並且它是否具有名爲「FTP」或「SFTP」的值?我只是將代碼作爲示例編寫,我不知道您是如何命名屬性的。您應該只使用上面的代碼作爲指導,並根據您的需要進行相應調整 –

+0

在使用之前,我確實將「Type」更改爲對我的數據有意義的內容。我會更新我的問題。 –

0

如果任何人有類似的問題,這是我躲在我需要隱藏的字段。我意識到,這幾乎肯定不是這樣做的最好方式,但它的工作原理。

我所做的是爲條件可見的每組字段設置一些布爾變量。然後每次單擊單選按鈕時,都會相應地更改布爾變量。我使用TemplateFields SortExpression來組合需要在一起的字段。

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