событие динамического регистра веб-формы выпадающего списка в Pageload не сработает - PullRequest
0 голосов
/ 08 ноября 2018

Мне нужен обработчик событий динамического регистра.
Я попытался создать некоторый фрагмент кода для веб-формы ASP.NET и понял, что «что-то», которое делает выпадающий список, не вызовет событие 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;
    }

Во-вторых, я удаляю Autopostback и OnSelectedIndexChanged из раскрывающегося списка 1 в представлении и перемещаю обработчик регистра в код 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. Это ошибка Microsoft? Если это так, где я могу опубликовать эту ошибку?

1 Ответ

0 голосов
/ 08 ноября 2018

Короче говоря, каждый запрос заново создает страницу и элементы управления.

Таким образом, «Posting Back» снова загрузит страницу, но с IsPostBack, установленным на true, и регистрация вашего события никогда не будет достигнута.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...