我有一个使用模板字段的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多个字段的索引。
答案 0 :(得分:1)
看看下面的例子。我写了一个包含三个字段的简单类:
如果查看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;
}
}