2016-08-02 40 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;     
     } 
    }