Pageload 中的下拉列表 webform 动态注册事件不会触发

dropdown list webform dynamic register event in Pageload won't fire

我需要一个动态注册事件处理程序。
我尝试为 ASP.NET 网络表单编写一些片段代码,并意识到 'something' 使下拉列表不会触发事件 SelectedIndexChanged。

第一个片段(效果很好)。我在 ASPX 文件中注册事件处理程序。

<form id="form1" runat="server">
    <asp:Label ID="lblName" runat="server" Text="Label"></asp:Label>
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    <asp:DropDownList ID="Ddl1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="Ddl1_SelectedIndexChanged">
    </asp:DropDownList>

    <asp:DropDownList ID="Ddl2" runat="server"  AutoPostBack="true" OnSelectedIndexChanged="Ddl2_SelectedIndexChanged">
    </asp:DropDownList>
    <asp:Button ID="BtnSubmit" runat="server" Text="Submit" OnClick="BtnSubmit_Click" />
</form>

然后在 CS 文件中,我创建了 2 个这样的函数

protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {

            Ddl2.Items.Add(new ListItem("1", "1"));
            Ddl2.Items.Add(new ListItem("2", "2"));
            Ddl2.Items.Add(new ListItem("3", "3"));
            Ddl2.Items.Add(new ListItem("4", "4"));

            Ddl1.Items.Add(new ListItem("1", "1"));
            Ddl1.Items.Add(new ListItem("2", "2"));
            Ddl1.Items.Add(new ListItem("3", "3"));
            Ddl1.Items.Add(new ListItem("4", "4"));


            BtnSubmit.Click += new EventHandler(BtnSubmit_Click);

            Ddl1.SelectedIndex = 0;
            Ddl2.SelectedIndex = 0;
        }
    }
    public void Ddl2_SelectedIndexChanged(object sender, EventArgs e)
    {
        var st = new StackTrace();
        var sf = st.GetFrame(0);

        var currentMethodName = sf.GetMethod();
        Console.WriteLine(currentMethodName);
        Label1.Text = Ddl2.SelectedValue;
    }

    public void Ddl1_SelectedIndexChanged(object sender, EventArgs e)
    {
        var st = new StackTrace();
        var sf = st.GetFrame(0);

        var currentMethodName = sf.GetMethod();
        Console.WriteLine(currentMethodName);
        Label1.Text = Ddl1.SelectedValue;
    }

其次,我在视图上删除了 dropwdown 1 的 Autopostback 和 OnSelectedIndexChanged,并将注册处理程序移至 PageLoad 代码。现在它不会再火了

下拉菜单 1 将提升刷新页面。但是事件处理程序不会再触发。 我正在使用 VS2017 Pro & .NET 4.7.2

<form id="form1" runat="server">
    <asp:Label ID="lblName" runat="server" Text="Label"></asp:Label>
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    <asp:DropDownList ID="Ddl1" runat="server">
    </asp:DropDownList>

    <asp:DropDownList ID="Ddl2" runat="server"  AutoPostBack="true" OnSelectedIndexChanged="Ddl2_SelectedIndexChanged">
    </asp:DropDownList>
    <asp:Button ID="BtnSubmit" runat="server" Text="Submit" OnClick="BtnSubmit_Click" />
</form>

在 CS 代码中:

        protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {

            Ddl2.Items.Add(new ListItem("1", "1"));
            Ddl2.Items.Add(new ListItem("2", "2"));
            Ddl2.Items.Add(new ListItem("3", "3"));
            Ddl2.Items.Add(new ListItem("4", "4"));


            Ddl1.Items.Add(new ListItem("1", "1"));
            Ddl1.Items.Add(new ListItem("2", "2"));
            Ddl1.Items.Add(new ListItem("3", "3"));
            Ddl1.Items.Add(new ListItem("4", "4"));


            BtnSubmit.Click += new EventHandler(BtnSubmit_Click);

            Ddl1.SelectedIndex = 0;
            Ddl2.SelectedIndex = 0;

            Ddl1.AutoPostBack = true;
            Ddl1.SelectedIndexChanged += new System.EventHandler(Ddl1_SelectedIndexChanged);

        }
    }
    public void Ddl2_SelectedIndexChanged(object sender, EventArgs e)
    {
        var st = new StackTrace();
        var sf = st.GetFrame(0);

        var currentMethodName = sf.GetMethod();
        Console.WriteLine(currentMethodName);
        Label1.Text = Ddl2.SelectedValue;
    }

    public void Ddl1_SelectedIndexChanged(object sender, EventArgs e)
    {
        var st = new StackTrace();
        var sf = st.GetFrame(0);

        var currentMethodName = sf.GetMethod();
        Console.WriteLine(currentMethodName);
        Label1.Text = Ddl1.SelectedValue;
    }

谁能帮帮我:

  1. 在页面加载或 APSX 文件上注册事件处理程序有什么区别?
  2. 我可以注册什么页面生命周期事件来触发事件处理程序?
  3. 这是微软的bug吗?如果是,我在哪里 post 这个错误?

长话短说,每个请求都会重新创建页面和控件。

因此,"Posting Back" 将再次加载页面,但 IsPostBack 设置为 true,并且您的活动注册永远不会到达。