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

时间:2016-08-02 13:20:36

标签: c# asp.net webforms

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

我已阅读SO问题并回答here。但是,它似乎并没有起作用。我尝试在我数据绑定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>

更新

我没有提供足够的信息。我想隐藏整个Field。这包括标题,项目/编辑/插入模板和任何子控件。我上面的工作是隐藏单个控件而不是整个Field。 不幸的是,我不能这样做:

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

因为TemplateFields不可绑定。

基本上,我想要相当于:

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

以最有效和可扩展的方式我可以做到。这种形式将来几乎肯定会改变,我不希望有人必须回过头来找出需要动态显示或隐藏的所有20多个字段的索引。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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;                
        }
    }