Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.Net中的use控件中未触发按钮单击事件_C#_Asp.net - Fatal编程技术网

C# 在ASP.Net中的use控件中未触发按钮单击事件

C# 在ASP.Net中的use控件中未触发按钮单击事件,c#,asp.net,C#,Asp.net,我正在开发一个asp网页,其中有一个下拉组合框和一个占位符。当用户从下拉组合框中选择项目时,将向服务器端进行回发,服务器将asp用户控件加载到此父页面中的占位符。到目前为止,一切正常 在用户控件中,我有一个按钮,后面的用户控件代码用于处理按钮单击事件。问题是,当我单击此按钮时,我可以看到回发被发送到服务器端(即在调试模式下调用父页面页面页面加载()),但用户控件的页面加载()或按钮单击事件处理程序都未被调用 请帮忙 一些补充信息 我的父页不是asp母版页。只是一个简单的asp页面 我正在使用VS

我正在开发一个asp网页,其中有一个下拉组合框和一个占位符。当用户从下拉组合框中选择项目时,将向服务器端进行回发,服务器将asp用户控件加载到此父页面中的占位符。到目前为止,一切正常

在用户控件中,我有一个按钮,后面的用户控件代码用于处理按钮单击事件。问题是,当我单击此按钮时,我可以看到回发被发送到服务器端(即在调试模式下调用父页面页面页面加载()),但用户控件的页面加载()或按钮单击事件处理程序都未被调用

请帮忙

一些补充信息

  • 我的父页不是asp母版页。只是一个简单的asp页面
  • 我正在使用VS2008和.NET3.5SP1和C

  • 您需要确保UserControl存在,以便在重建viewstate时触发button click事件

    在页面加载中加载您的UserControl将首次起作用。当您单击按钮并执行回发时,页面加载尚未发生。这意味着UserControl将不存在,这意味着该按钮不存在,事件将被连接备份。因此,带有按钮的UserControl无法连接到click事件,并且click事件不会触发

    建议在此事件中加载用户控件

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        //-- Create your controls here
    }
    
    尝试沙箱测试。在页面加载中,在页面加载中动态创建带有单击事件的按钮。您将看到click事件不会触发。现在将按钮移动到OnLoad事件。单击事件将触发。另外请注意,单击事件将发生在页面加载事件之前。进一步证明按钮在正确的时间不存在

    另一个想法。。。 在按钮事件发生之前,您正在重新加载页面上的usercontrol。确保LoadControl方法位于If块内

    if (!IsPostBack)
    {
        //load usercontrol
    }
    
    Default.aspx

    <asp:PlaceHolder runat="server" ID="ph1">
    </asp:PlaceHolder>
    
    <asp:DropDownList ID="ddl1" runat="server" AutoPostBack="true">
        <asp:ListItem Value="0" Text="--select a value--" />
        <asp:ListItem Value="1" Text="User control 1" />
        <asp:ListItem Value="2" Text="User control 2" />
    </asp:DropDownList>
    <asp:PlaceHolder runat="server" ID="ph1">
    </asp:PlaceHolder>   
    

    UserControl.ascx

    <h3>User control</h3>
    <asp:Button ID="btn1" runat="server" OnClick="btn1_Click" Text ="Click me" />
    
    一切都很有魅力。当我点击按钮时,我看到写着“你点击了我,耶”

    关注点。如果您尝试在下拉控件的SelectedItemChanged事件处理程序中动态加载示例中的控件,它将失败,因为ASP.Net页的生命周期工作方式不同。 相反,您应该在页面的PageLoad事件中处理此类控件的创建,如下面的示例所示 Default.aspx

    <asp:PlaceHolder runat="server" ID="ph1">
    </asp:PlaceHolder>
    
    <asp:DropDownList ID="ddl1" runat="server" AutoPostBack="true">
        <asp:ListItem Value="0" Text="--select a value--" />
        <asp:ListItem Value="1" Text="User control 1" />
        <asp:ListItem Value="2" Text="User control 2" />
    </asp:DropDownList>
    <asp:PlaceHolder runat="server" ID="ph1">
    </asp:PlaceHolder>   
    

    在我的特定案例中,我发现问题在于UserControl ID(或者更确切地说是缺少)

    当UserControl第一次实例化时,我的按钮ID是ctl00$ctl02$BTNCONCONTINUE,但回发后它已更改为ctl00$ctl03$BTNCONCONTINUE,因此按钮事件处理程序没有启动


    相反,我添加了一个固定ID的UserControl,现在按钮总是加载ID ctl00$myUserControl$btnContinue。

    一些附加信息,比如一些代码会有所帮助。指令中的AutoEventWireup=“true”是否在页面顶部?如果您想知道什么是AutoEventWireup,请参考以下内容:+1以提供一个很好的示例。让我们希望OP在这之后看到一些不正确的东西。这是有效的,因为您在每次回发时都加载相同的用户控件。我需要做的是根据组合框的选定索引加载不同的用户控件。因此,我正在combobox的SelectedIndexChanged事件处理程序中加载用户控件。那么,这就是您的问题-您正在使用SelectedIndexChanged事件。相反,您应该在Page_Load事件期间加载所有动态控件example@Trogvar:测试时,请确保正确的用户控件显示“耶,我是UC1,你单击了我”或“耶,我是UC2,你单击了我”,并确保正确的用户控件对应于单击的按钮。尝试了此操作。问题是,comboxbox SelectedIndexChanged事件最后一次触发此更改。之前,我在这个组合框SelectedIndexChanged事件处理程序中加载了用户控件,因为根据所选的索引,我需要加载不同的用户控件。现在,我更改了SelectedIndexChanged,将当前索引分配给父页面代码隐藏中的公共属性,并在OnLoad()事件处理程序中切换此属性以加载所需的用户控件。但由于SelectedIndexChanged上次触发,因此无法工作。您能否访问组合框。OnLoad中的SelectedIndex?如果是这样,加载控件。谢谢Valamas。。我可以在OnLoad中访问所选的索引。。它成功了……)
    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            switch (ddl1.SelectedValue)
            {
                case "1":
                    var ctl = LoadControl("Controls/UserControl.ascx");
                    ph1.Controls.Add(ctl);
                    break;
                case "2":
                    ctl = LoadControl("Controls/UserControl2.ascx");
                    ph1.Controls.Add(ctl);
                    break;
            } 
        }
    }