与ASP.net中的UserControl相关的问题

时间:2013-02-22 09:33:18

标签: c# asp.net user-controls

我有一个asp.net webapplication,我在Master Page下面有一个aspx页面。我有两个UserControl:(1)UC1(2)UC2。 UC1在Master Page设计中添加,UC2在aspx页面设计中添加..

现在我在UC1上有一些复选框,其AutoPostback属性为True ..在Checked_Change事件中,我在Session中添加了一些值。然后我想调用UC2 userControl中的函数

但问题是当复选框检查更改UC2'代码首先执行然后UC1的代码执行..所以在UC2的代码中没有找到任何在UC1代码中添加的会话值

那么如何更改UserControls的代码执行顺序???

有没有办法通过UC1找到MasterPage的子页面???

由于

1 个答案:

答案 0 :(得分:0)

是的,这不是控件之间通信的好方法,使用session也不是一个好的做法。但是,你可以做的是这样的事情:

在母版页上,使用ContentPlaceHolder尝试查找UC2,您需要使用其ID才能使用FindControl方法:

Control ctrl = ContentPlaceHolder.FindControl("UC2_ID");

if (ctrl != null && ctrl is UC2)
{
    UC2 uc2 = (UC2)ctrl;

    uc2.TakeThisStuff(stuff);
}

或者,如果你真的不知道它的ID,你可以遍历ContentPlaceHolder控件,直到找到一个类型为UC2的控件。

public T FindControl<T>(Control parent) where T : Control
{
    foreach (Control c in parent.Controls)
    {
        if (c is T)
        {
            return (T)c;
        }
        else if (c.Controls.Count > 0)
        {
            Control child = FindControl<T>(c);
            if (child != null)
                return (T)child;
        }
    }

    return null;
}

像这样使用:

UC2 ctrl = FindControl<UC2>(ContentPlaceHolder);

if (ctrl != null)
{
    UC2 uc2 = (UC2)ctrl;

    uc2.TakeThisStuff(stuff);
}