【问题标题】:I don't really understand Page.FindControl我不太了解 Page.FindControl
【发布时间】:2012-05-12 09:08:45
【问题描述】:

我有这样的图像:

<asp:Image runat="server" ID="btnabout1" ImageUrl="~/graphics/buttons/btnabout1.png" AlternateText="About" />

我可以像这样(显然)从代码隐藏中访问控件:

btnabout1.Visible = false;

但这不起作用:

Page.FindControl("btnabout1").Visible = false;

重点是使用变量controlID并设置属性。

我想我对方法的理解有误,请高人赐教。


目的是创建一个获取当前页面文件名并相应地设置图像/按钮可见/不可见的方法。像这样:

string filename = System.IO.Path.GetFileName(HttpContext.Current.Request.FilePath);
string strippedfilename = filename.Substring(0, filename.IndexOf("."));
Page.FindControl("btn" + strippedfilename + "3").Visible = true;
Page.FindControl("btn" + strippedfilename + "2").Visible = false;
Page.FindControl("btn" + strippedfilename + "1").Visible = false;

由于我无法让 Page.FindControl 工作,我正在使用

Dictionary<string, Control[]>

相反,但它当然不是动态的,因为添加新页面意味着必须添加到字典中,但我想现在还可以......

【问题讨论】:

  • 您在哪个页面生命周期事件中调用Page.FindControl() 方法?确保它至少是Page_Init(或以后的事件)。您可以查看此链接以查看通过 ID 查找控制的递归方法:msdn.microsoft.com/en-us/library/y81z8326.aspx。还要确保控件 NOT 在项目模板中,即在 Repeater 控件中(这样就不会找到)。
  • 这张图片是在 yourpagename.aspx 还是 yourusercontrol.ascx 中?

标签: c# asp.net controls


【解决方案1】:

您用于FindControl 的重载仅查看直接子控件 - 如果嵌套更深,则找不到控件。

还有另一个重载可以让您提供函数应该经过多少级嵌套 - 这可以让您更深入地挖掘(以成本 - 性能)。

由于您可以简单地使用btnabout1.Visible = false;,因此在这种情况下无需使用FindControl

【讨论】:

  • 只有在控件由某些 IDE 自动生成时才有效。如果您要动态添加控件(Page.Controls.Add 或类似的东西),此解决方案将不起作用。
  • @user35443 - 恕我直言,如果您是正确的,您的答案也会遇到同样的问题。我也应该投反对票吗?
  • 我只是不认为你有他需要的解决方案。我认为他不是智障,他知道他可以尝试使用 this.dačo,但如果他需要使用 FindControl,他知道原因。如果你认为你有理由,你可以投反对票。
  • @user35443 - 不要猜测,而是添加评论并询问 OP。我相信我理解 OP 的要求。
【解决方案2】:

首先,我认为 FindControl 方法不是递归的。要使用此方法,您可能需要通过所有父控件(如面板或其他控件)调用它。

如果您使用的是母版页,请尝试使用这个:

ContentPlaceHolder h = (ContentPlaceHolder)this.Master.FindControl("ContentPlaceHolderName");
h.FindControl("");

【讨论】:

    【解决方案3】:

    使用方法如下

    Button btnAbout=(Button)Page.FindControl("btnAbout");
    btnAbout.Visible=false;
    

    这是使用此方法的正确方法。

    【讨论】:

    • 不需要。 Visible 属性派生自 Control 类,它是 Button 类的父类,
    • Image btnAbout1 = (Image)Page.FindControl("btnabout1"); btnAbout1.Visible = false; 也不起作用。 btnAbout1 为空。
    • 告诉你。您需要通过 btnabout 的所有父控件。
    猜你喜欢
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多