如何将ascx事件从动态加载的ascx页面连接到aspx页面......?

时间:2013-09-04 22:38:34

标签: c# asp.net user-controls

这段代码在我的ASPX页面中。下面显示的代码段用于根据用户在ASPX页面上做出的某些选择动态加载用户控件。

    protected void loadUserControl(string tmUCName)
    {
        phDetail.Controls.Clear();
        ViewState["vsControl"] = null;
        UserControl tmUControl = LoadControl(tmUCName) as UserControl;
        tmUControl.ID = "ucidControl";
        phDetail.Controls.Add(tmUControl);
        ViewState["vsControl"] = tmUCName;
    }

ASCX工作,ASCX页面上的SELECT事件也是如此。我的问题是从ASCX页面上的select事件获取值到ASPX页面。由于用户控件(ASCX)是动态加载的(基于ASPX页面上的某些选择),我发现很难将事件从ASCX连接到ASPX页面。在一个明确的负载情况下,我没有问题......一切都非常好......

对于它的价值,如果页面是明确加载的,例如:

PlaceHolder1.Controls.Clear();
WebUserControlTest02 = LoadControl(@"~\WebUserControl2.ascx") as WebUserControl2;
WebUserControlTest02.gvASCX02SelectedIndexChanged += new EventHandler (WebUserControlTest02_gvASCX02SelectedIndexChanged);
PlaceHolder1.Controls.Add(WebUserControlTest02);

我在ASPX和ASCX页面之间连接事件没有问题。

1 个答案:

答案 0 :(得分:1)

编辑:问答分为两部分。第一部分是如何"bubble" UserControl内控件上发生的事件。这是通过处理内部控件的事件然后在UserControl本身上触发类似的事件来完成的。在这种情况下,UserControl's事件与内部控件的事件共享相同的名称和签名。这不是必需的,但在这种情况下,这样做是有道理的。

第二部分是如何动态加载UserControls但仍然包含在每个UserControl类上定义的这个冒泡事件的包含网页。问题是ASP.NET UserControl类本身没有定义事件,动态加载的UserControls的唯一常见方面是它们都是UserControl类型的事实。 通过让所有UserControls实现定义事件的公共接口来解决此问题。通过将UserControl变量强制转换为接口类型,您可以访问接口定义的事件。那时你可以连接网页来处理这个事件。

这两个部分一起允许ListBox控件中的事件由包含UserControl的{​​{1}}重复,并且对于动态加载了ListBox的网页UserControl听取并回应同一事件。


首先使用您想要处理的事件定义一个接口:

public interface IMyUserControl
{
    event EventHandler SelectedIndexChanged;

}

接下来,让每个UserControl实现此事件并连接列表框的SelectedIndexChanged事件:

public partial class WebUserControl1 : System.Web.UI.UserControl, IMyUserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        ListBox1.SelectedIndexChanged += (o, args) =>
        {
            var selectedIndexChanged = SelectedIndexChanged;
            if (selectedIndexChanged != null)
                selectedIndexChanged(o, args);
        };
    }

    public event EventHandler SelectedIndexChanged;
}

现在在您的公共代码中,将UserControl转换为接口类型和中提琴,您可以访问事件:

protected void loadUserControl(string tmUCName)
{
    phDetail.Controls.Clear();
    ViewState["vsControl"] = null;
    UserControl tmUControl = LoadControl(tmUCName) as UserControl;
    tmUControl.ID = "ucidControl";
    phDetail.Controls.Add(tmUControl);
    ViewState["vsControl"] = tmUCName;
    ((IMyUserControl)tmUControl).SelectedIndexChanged += OnUserControlSelectedIndexChanged
}

private void OnUserControlSelectedIndexChanged(object sender, EventArgs args)
{
    // ...
}