如何在DetailsView中动态隐藏模板字段

本文关键字:隐藏 字段 动态 DetailsView | 更新日期: 2023-09-27 17:59:39

我有一个使用模板字段的DetailsView。我希望发生的情况是,当字段值为"FTP"时,它将显示与FTP相关的字段,否则它显示与SFTP相关的字段。

我已经在这里阅读了SO问答。然而,它似乎不起作用。在数据绑定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>

更新

我没有提供足够的信息。我想把整个球场都藏起来。这包括页眉、项目/编辑/插入模板和任何子控件。我上面的工作是隐藏单个控件,而不是整个领域。不幸的是,我不能这么做:

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

因为TemplateFields不可绑定。

基本上,我想要相当于:

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

以我能做到的最高效和可扩展的方式。这种形式在未来几乎肯定会改变,我不希望有人不得不回去计算所有20多个需要动态显示或隐藏的字段的索引。

如何在DetailsView中动态隐藏模板字段

看看下面的例子。我写了一个有三个字段的简单类:

  • 类型
  • 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; }
}

如果有人有类似的问题,这就是我隐藏需要隐藏的字段的方法。我意识到这几乎肯定不是最好的方法,但它是有效的。

我所做的是为条件可见的每组字段设置一些布尔变量。然后,每次单击单选按钮时,都会相应地更改布尔变量。我使用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;                
        }
    }