1

这段代码在我的 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 页面上的选择事件中获取值到 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 页面之间的连接事件没有任何问题。

4

1 回答 1

1

编辑:问题和答案分为两部分。第一部分是如何“冒泡”UserControl. 这是通过处理内部控件的事件然后在其UserControl自身上触发类似事件来完成的。在这种情况下,UserControl's事件与内部控件的事件共享相同的名称和签名。这不是必需的,但在这种情况下这样做是有意义的。

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

这两个部分一起允许源自控件的事件由包含 的ListBox控件重复,并允许动态加载的网页侦听和响应相同的事件。UserControlListBoxUserControl


首先定义一个包含您要处理的事件的接口:

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)
{
    // ...
}
于 2013-09-04T23:22:17.587 回答