3

我有一个在页面加载中动态加载的用户控件:

protected void Page_Load(object sender, EventArgs e)
{
    MyControl ctl = (MyControl)LoadControl(controlPath);
    ctl.ID = "mycontrol";
    this.MyControlPlaceHolder.Controls.Add(ctl);
}

页面前端:

<asp:PlaceHolder runat="server" ID="MyControlPlaceHolder"></asp:PlaceHolder>

我在页面上有一个点击事件,它启动和回发并调用我试图找到控件并设置一些属性的方法:

        MyControl ctl = (MyControl)FindControl("mycontrol");
        if (ctl != null){
            ctl.MyProperty = true;
            Response.Write("success");
        }
        else
            Response.Write("fail");

这是回发后写入失败,所以看起来我在查找控件时做错了一些事情。做这个的最好方式是什么?

编辑:

I switched it to MyControl ctl = (MyControl)this.MyControlPlaceHolder.FindControl("mycontrol");

这使得它可以找到控件,但是,当控件在回发后加载时,它看起来好像没有设置属性。

4

3 回答 3

2

您必须使用递归 FindControl 实现,因为 FindControl 只会找到直接子项。您的控件被插入到较低级别的命名容器中。来自 MSDN 的通用 FindControlRecurisve:

private Control FindControlRecursive(Control rootControl, string controlID)
{
    if (rootControl.ID == controlID) return rootControl;

    foreach (Control controlToSearch in rootControl.Controls)
    {
        Control controlToReturn = 
            FindControlRecursive(controlToSearch, controlID);
        if (controlToReturn != null) return controlToReturn;
    }
    return null;
}

来自 MSDN

或者,如果您的样本中只有一个特定的容器:

MyControl ctl =  this.MyControlPlaceHolder.FindControl("mycontrol");

if (ctl != null){
            ctl.MyProperty = true;
            Response.Write("success");
        }
        else
            Response.Write("fail");

ViewState 启用您的控件

public class MyControl:Control
{
   public bool MyProperty
   {
       get 
       {
           return ViewState["my"] != null? (bool) ViewState["my"]: false; 
       }
       set 
       {
           ViewState["my"]  = value;
       }
   }
}
于 2013-07-19T15:25:28.150 回答
0

尝试移动代码以将控件动态添加到 Init 而不是加载。我不能确定,但​​是在 Init 和 Load 之间发生了很多事情,如果您的控件不存在并且没有考虑到它可能会导致这样的问题。

于 2013-07-19T15:28:12.823 回答
0

您在占位符的控件集合中添加了控件。除了动态创建的控件之外,如果您想以这种方式查找动态添加的控件,则必须从根(可能是页面)开始进行递归搜索,因此,如果您在网上冲浪,您可以找到很好的解决方案。

我个人更喜欢以下解决方案:泛型支持并表示为扩展方法,因此您可以在任何地方使用该解决方案。这些是一些有用的链接

  1. 使用泛型的递归查找控件
  2. 通过扩展方法使用泛型递归查找控件
  3. 通过扩展方法和 linq 支持/示例使用泛型递归查找控件

希望这可以帮助

于 2013-07-19T15:36:38.580 回答