Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка под ASP.NET > Событие динамически создаваемого контрола


Автор: anabiosys 17.12.2007, 10:04
В обработчике нажатия на кнопку Button1 создаю кнопку Button2 и присваиваю ей
обработчик на нажатие(Button2Click). Но по нажатию на эту кнопку(Button2) обработчик не отрабатывает и сама кнопка пропадает.

Код

void Button1Click(object sender, EventArgs e)
{
        Button Button2=new Button();
        Button2.ID = "_b2";
        Button2.Text = "Button2";
        Button2.Click += new EventHandler(Button2Click);
        this.Controls.Add(Button2);
}
void Button2Click(object sender, EventArgs e)
{
        //не работает
}

Автор: tol05 17.12.2007, 10:39
создавать динамический контрол нужно только в Page_Load() или раньше. Это много раз обсуждалось, поищи на форуме.

Автор: anabiosys 17.12.2007, 10:47
Но как я узнаю в Page_Load нажималась ли первая кнопка или нет?

Автор: Mymik 17.12.2007, 11:01
anabiosys, ставь флажки: записуй в HiddenField, Session, Cookie, добавляй get параметры... smile вобщем любой нужный тебе способ.

Автор: tol05 17.12.2007, 11:59
Можно при постбеке просматривать Request.Form.AllKeys и если там будет ключ Button1, то она и вызвала возврат формы.
Пример
Код

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
        <asp:Button ID="Button2" runat="server" OnClick="Button1_Click" Text="Button" />
        <asp:Button ID="Button3" runat="server" OnClick="Button1_Click" Text="Button" />
    </div>
    </form>
</body>
</html>

Нажимаем разные кнопки, в Page_Load ставим брейкпоинт и смотрим ключи.

Автор: anabiosys 17.12.2007, 13:02
Спасибо, попробую. Просто думал в .Net должно быть как-то покультурнее.

Автор: tol05 17.12.2007, 14:04
да нет, все через request и hidden-поля работает. Вот для Page код.
Код

private void RaisePostBackEvent(NameValueCollection postData)
{
    if (this._registeredControlThatRequireRaiseEvent != null)
    {
        this.RaisePostBackEvent(this._registeredControlThatRequireRaiseEvent, null);
    }
    else
    {
        string str = postData["__EVENTTARGET"];
        bool flag = !string.IsNullOrEmpty(str);
        if (flag || (this.AutoPostBackControl != null))
        {
            Control control = null;
            if (flag)
            {
                control = this.FindControl(str);
            }
            if ((control != null) && (control.PostBackEventHandler != null))
            {
                string eventArgument = postData["__EVENTARGUMENT"];
                this.RaisePostBackEvent(control.PostBackEventHandler, eventArgument);
            }
        }
        else
        {
            this.Validate();
        }
    }
}

честно говоря, нет времени разбираться, но и так видно, что через ключи request-а работа идет...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)