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


Автор: KelTron 3.9.2008, 12:01
Здравствуйте!

Есть, например, такой код:
Код

public partial class _Default : System.Web.UI.Page {
    protected void Page_Load(object sender, EventArgs e) {
    }
    private void CreateButtons(int n) {
        for (int i = 0; i < 10; ++i) {
            Button btn = new Button();
            btn.Text = n.ToString() + i.ToString();
            btn.Click += new EventHandler(btn_Click);
            Panel1.Controls.Add(btn);
        }
    }
    void btn_Click(object sender, EventArgs e) {
        Button btn = (Button)sender;
        Label1.Text = btn.Text;
    }
    protected void LinkButton1_Click(object sender, EventArgs e) {
        CreateButtons(1);
    }
    protected void LinkButton2_Click(object sender, EventArgs e) {
        CreateButtons(2);
    }
}

На форме есть Label, Panel, и 2 LinkButton
При щелчке на одном из линк баттонов в панельке создаются кнопки, но при щелчке на любой из них происходит возврат формы и они все уничтожаются, следовательно не вызывается метод btn_Click.

Чтобы исправить ситуацию, я изменил код так:
Код

public partial class _Default : System.Web.UI.Page {
    protected void Page_Load(object sender, EventArgs e) {
        int n = 1;
        if (ViewState["num"] != null) { 
            n = (int)ViewState["num"];       
        }
        CreateButtons(n);    
    }
    private void CreateButtons(int n) {
        for (int i = 0; i < 10; ++i) {
            Button btn = new Button();
            btn.Text = n.ToString() + i.ToString();
            btn.Click += new EventHandler(btn_Click);
            Panel1.Controls.Add(btn);
        }
    }
    void btn_Click(object sender, EventArgs e) {
        Button btn = (Button)sender;
        Label1.Text = btn.Text;
    }
    protected void LinkButton1_Click(object sender, EventArgs e) {
        ViewState["num"] = 1;
    }
    protected void LinkButton2_Click(object sender, EventArgs e) {
        ViewState["num"] = 2;
    }
}


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

Чтобы решить эту проблему мне в голову пришел такой способ: генерировать возврат формы программно при каждом щелчке на линк баттоне. 
Код

    protected void LinkButton1_Click(object sender, EventArgs e) {
        ViewState["num"] = 1;
        // Вот здесь должен генерироваться возврат формы
    }


Вопрос в том как? Погуглил, посмотрел в книжках, не нашел ничего подобного.
Подскажите пожалуйста как это сделать, или если есть другой способ очень хочется узнать его...)

Автор: Idsa 3.9.2008, 12:26
Можно, например, перенести создание кнопок в Page_PreRender.

Автор: KelTron 3.9.2008, 13:40
Сделал так, кнопки стали отображаться как надо, но они перестали реагировать на нажатие. Метод btn_Click не вызывается...

Автор: Idsa 3.9.2008, 16:46
Ага. Точно. Проглядел.

Вижу парочку workaround'ов. Приведу самый простой.
1. Меняем код обработчиков кликов по LinkButton'ам:
Код

protected void LinkButton1_Click(object sender, EventArgs e)
        {
            ViewState["num"] = 1;
            this.Panel1.Controls.Clear();
            this.CreateButtons(1);            
        }
        protected void LinkButton2_Click(object sender, EventArgs e)
        {
            ViewState["num"] = 2;
            this.Panel1.Controls.Clear();
            this.CreateButtons(2);
        }

При щелчке очищаем Panel1 и добавляем контент заново.
2. Добавляем в метод CreateButtons присвоение идентификатора:
Код

private void CreateButtons(int n)
        {
            for (int i = 0; i < 10; ++i)
            {
                Button btn = new Button();
                btn.ID = i.ToString(); //новая строчка
                btn.Text = n.ToString() + i.ToString();
                btn.Click += new EventHandler(btn_Click);
                Panel1.Controls.Add(btn);
            }
        }


Добавлено через 5 минут и 15 секунд
Предполагалось, что в Page_PreRender ничего не переносилось.

Автор: KelTron 3.9.2008, 17:07
Большое спасибо, теперь все работает.

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