Как добавить EventHandle _NOT_ в Page_Load - PullRequest
0 голосов
/ 21 июня 2011

Я делаю динамическую таблицу в Page_LoadComplete, я не могу сделать в Page_Load, потому что данные могут быть изменены во время обработки событий, поэтому в Page_LoadComplete я делаю несколько кнопок и хочу добавить их EventHandler:

protected void Page_LoadComplete(object sender, EventArgs e) {
   btn.Click += new EventHandler(b_Click);
}

Но это не работает, как добавить события к кнопке не в Page_Load?


простой, даже не динамический код:

void b_Click(object sender, EventArgs e) {
Label1.Text = "!!!";
}
protected void Page_Load(object sender, EventArgs e) {
Button1.Click += new EventHandler(b_Click);
}

на Page_Load работает нормально.

protected void Page_LoadComplete(object sender, EventArgs e) {
Button1.Click += new EventHandler(b_Click);
}

на Page_LoadComplete ничего не делать.

Ответы [ 3 ]

0 голосов
/ 21 июня 2011

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

Поскольку ваша группа элементов управления основана на данных, используемых в форме, вы должны поместитьвсю логику создания элемента управления в одной функции, а в обработчиках событий манипулируйте данными, затем вызывайте функцию логики создания элемента управления, в то время как при загрузке страницы вы просто вызовете функцию создания элемента управления (при условии, что вы уже сохранили данные междузвонки), чтобы все элементы управления, которые были созданы в первый раз, были воссозданы.Затем, после их воссоздания, они могут реагировать на события, которые они запустили.

0 голосов
/ 21 июня 2011

Хорошо, вот пример: Учитывая этот фрагмент HTML:

<body>
    <form id="form1" runat="server">
    <div>
    <asp:Button runat="server" Text="Click Me" OnClick="go_" />
    </div>
    </form>
</body>

public partial class WebForm1 : System.Web.UI.Page
{
    public int ControlCount
    {
        get { return ViewState["Controls"] == null ? 0 : (int)ViewState["Controls"]; }
        set { ViewState.Add("Controls", value); }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        for(int i = 0; i < ControlCount; i++)
        {
            Button b = new Button();
            b.Click += btn_Click;
            b.Text = "Hi";
            form1.Controls.Add(b);
        }
    }

    void btn_Click(object sender, EventArgs e)
    {
        ((Button)sender).Text = "bye";
    }

    protected void go_(object sender, EventArgs e)
    {
        Button btn = new Button();
        btn.Text = "Hi";
        form1.Controls.Add(btn);
        btn.Click += new EventHandler(btn_Click);
        ControlCount++;
    }
}

Каждый раз, когда вы нажимаете первую кнопку, на страницу добавляется новая кнопка с текстом «Привет», и каждый раз, когда вы нажимаете кнопку «Привет», текст только для кнопки «ТО» изменится на «Пока»

Это работает, потому что я добавляю элементы управления дважды. Однажды в обработчике событий главной кнопки, где я определяю, что мне нужен новый элемент управления, а затем снова ВНИЗ в OnLoad, где у меня снова новая пустая страница, но теперь я знаю (через ControlCount), сколько элементов управления я добавил.

0 голосов
/ 21 июня 2011

Проблема в том, что элемент управления не существует при обратной передаче (поскольку вы создали его во время выполнения). Создание элемента управления в Init должно решить эту проблему и позволить событию сработать. Вы можете изменить все свойства в LoadComplete, если хотите, но кнопка должна существовать в этой точке.

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