在同一页面中从另一个用户控件找到用户控件的控件

3
我创建了一个带有树形视图的usercontrol

现在我在一个aspx页面中两次放置它,并分别使用不同的Id,比如usercontrolAusercontrolB

它们都被逐个加载到页面中。
现在,在usercontrolApre-render事件中,我想要获取usercontrolBtreeview控件对象。

我该如何实现?
6个回答

4

要访问两个用户控件中的treeview控件,您需要拥有usercontrolB实例。因此,请尝试在某个适当的存储中保留该实例,以便在pre-render事件中访问它。

  1. Introduce a property to hold the UC Type inside the User-Control:

    public MyUserControl MainUserControl { get; set; }
    
  2. In the parent ASPX set the property with usercontrolB:

    usercontrolA.MainUserControl = usercontrolB;
    usercontrolB.MainUserControl = usercontrolB;
    
  3. Now you can use the MainUserControl property to access your TreeView:

    MainUserControl.treeView1 ...
    

是的,我知道,如果我像从父页面查找用户控件,然后再从中查找树形视图那样做。有没有更直接容易的方法找到它? - Dev
由于您的要求是在两个用户控件中访问usercontrolB的treeview,因此没有直接访问treeview的方法。您必须在访问treeview之前保留usercontrolB的实例。 - Furqan Safdar
好的,谢谢,但我会等待直接的解决方案。如果我得不到它,那么我会按照这个步骤,并标记答案为已采纳,并点赞。谢谢 :) - Dev
我尝试了很多方法,但最后发现只有这种方式简单且实用。谢谢 :) - Dev
@FSX 我应该为两个用户控件引入一个属性吗? 这个属性应该在父级 ASPX 中设置在哪里? - Amir
@Amir,用户控件对于两个实例是相同的,因此您只需要在其中引入(一个地方)属性。然后在父级中,您可以在Load事件处理程序中设置该属性。 - Furqan Safdar

2
这个例子是在表单上查找名为"treeview"的"usercontrolB"控件。
            Control[] ctrl = this.Controls.Find("usercontrolB", true);
            if (ctrl != null && ctrl.Length > 0)
            {
                TreeView tv = (TreeView)ctrl[0];
                // do whatever you want with the treeview
            }

我想从用户控件中访问它,而不是页面。我没有一个在用户控件内部的用户控件,所以在用户控件自身的prerender事件中,如何找到usercontrolB? - Dev
抱歉,我误解了。希望有人能帮助你 :) - mrkurtan

1
为什么你需要在PreRender中访问它?
你需要创建一个自定义事件: 主页面
var uc1 = (UserControlType1)LoadControl("UC1.ascx");
var uc2 = (UserControlType1)LoadControl("UC2.ascx");
uc2.PreRendered += uc2_PreRendered;

public void uc2_PreRendered(object sender, TreeView tv){
    // you can access your treeview from here
}

用户控制 B

public delegate void PreRenderDelegate(object sender, TreeView tv);
public event PreRenderDelegate PreRender;

public void OnPreRender(object sender, EventArgs e){
    if(this.Prerendered!=null)
        this.Prerendered(this, aTreeView);
}

uc2.PreRendered += uc2_PreRendered; 给我报错:"没有重载 'uc2_PreRender' 与委托 'System.EventHandler' 匹配。" - Dev
@Dev 我认为 uc2.PreRendered 应该改成 uc2.PreRender,这样就能匹配 User Control B 代码中的事件了。 - Trisped
你只需要在第二个UserControl(带有TreeView)中创建一个自定义事件,然后在页面上订阅该事件。当事件被调用时,将TreeView传递给第一个UserControl。 - Echilon

0
您可以在用户控件A的OnPreRender事件中使用以下代码:
var tree = this.Page.FindControl("uc2").FindControl("treeview1");

注意:“uc2”是ASPX页面中User-ControlB的ID。

或者您可以尝试这个:

 var tree = this.Page.LoadControl("UserControlB.ascx").FindControl("treeview1");

我想在用户控件本身中实现。我想在用户控件的预呈现事件中获取用户控件的树视图。 - Dev

0
Var str=This.Page.findControl("UserControlName").FindControl("NameOfTheControlToFind")

0

(我只是重新发布我的帖子,供其他人参考)

您可以通过将某些值作为属性传递并再次调用RadTree(您用户控件中的那个)的databind方法来始终更新RadTreeView,使用控件的事件。话虽如此,我认为您可以传递RadTree本身的对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接