Кнопка не хочет вызывать метод (ASP.NET - C #) - PullRequest
1 голос
/ 21 декабря 2010

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

Теперь к моей проблеме ... Я создаю новые кнопки с кодом C # и присоединяю их к моей панели с именем Panel1:

Button novgumb = new Button();
novgumb.Click += new EventHandler(ButtonOdstrani);
novgumb.CommandArgument = "2";
novgumb.Visible = true;
novgumb.Text = "Test";
Panel1.Controls.Add(novgumb);

Кнопка, созданная таким образом,должен вызвать мой метод ButtonOdstrani:

    public void ButtonOdstrani(object sender, EventArgs e)
    {
        string asd = ((Button)sender).CommandArgument;
        //...
    }

Теперь, когда я помещаю код Button в PageLoad, он работает нормально, но когда я помещаю его в свой метод для записи XML на сайт, кнопки, созданные таким образомне будет вызывать функцию ButtonOdstrani:

protected void IzpisXML()
    {
        BranjeXML();
        string[] element = ime.Split('$');
        //Button gumbs = new Button();
        //gumbs.Click += new EventHandler(ButtonOdstrani);
        //gumbs.Visible = true;
        //gumbs.Text = ("Odstrani ");
        //Panel1.Controls.Add(gumbs);
        for (; z < stevec/2; z++)
        {                    
            string imeGostilne = element[i];
            string naslov = element[i + 1];
            string telefon = element[i + 2];
            string spletnaStran = element[i + 3];
            string odpiralniOD = element[i + 4];
            string odpiralniDO = element[i + 5];
            string boni = element[i + 6];

            Label labela = new Label();

            labela.Text = "<b>Ime gostilne:</b> " + imeGostilne + "<br /><b>Naslov:</b> " + naslov + "<br><b>Telefon:</b> " + telefon + "<br><b>Spletna stran:</b> " + spletnaStran + "<br><b>Odpiralni cas:</b> " + odpiralniOD + " - " + odpiralniDO + "<br /><b>Študnetski boni:</b> " + boni + "<br />";
            labela.Enabled = true;
            labela.EnableTheming = true;
            labela.EnableViewState = true;
            labela.Visible = true;
            labela.ID = ("Label" + (z + 1));
            Panel1.Controls.Add(labela);

            Button novgumb = new Button();
            novgumb.Click += new EventHandler(ButtonOdstrani);
            novgumb.CommandArgument = "2";
            novgumb.Visible = true;
            novgumb.Text = "Test";
            Panel1.Controls.Add(novgumb);

            Label hr = new Label();
            hr.Text = "<hr />";
            hr.Visible = true;
            hr.Enabled = true;
            hr.EnableTheming = true;
            hr.EnableViewState = true;
            Panel1.Controls.Add(hr);
            i += 7;

        }
    }

Теперь обратите внимание на закомментированную кнопку за предложением for - она ​​не сработала другим способом.Я имею в виду, что «это не сработало», оно не вызывало функцию ButtonOdstrani, оно просто обновляло сайт (PostBack).

Я был бы очень благодарен за любое решение для совета.1015 *

ОК, теперь я создал следующее:

private Button[] ButtonZaOdstranjevanje;

    protected override void OnInit(EventArgs e)
    {
        ButtonZaOdstranjevanje = new Button[stevec/2];
        base.OnInit(e);
        BranjeXML();

        for (int j=0; j < stevec/2; j++)
        {
            Button novgumb = new Button();
            novgumb.Click += new EventHandler(ButtonOdstrani);
            novgumb.Visible = true;
            novgumb.Text = "Odstrani gostilno";
            ButtonZaOdstranjevanje[j] = novgumb;
        }

    }

Но проблема в том, что я получаю ошибку: «Индекс был вне границ массива», это происходит при:

ButtonZaOdstranjevanje[j] = novgumb;

Это не логично, поскольку значение stevec равно 4, поэтому stevec / 2 = 2, а для параметра j установлено значение 0. Кто-нибудь знает, как исправить эту ошибку?

Ответы [ 4 ]

5 голосов
/ 21 декабря 2010

при создании динамических элементов управления необходимо создавать заново при каждой обратной передаче.

см. здесь

1 голос
/ 21 декабря 2010

Ключевые моменты при создании динамического элемента управления в ASP.NET:

1- Элементы управления должны быть созданы в OnInit или лучше, но при переопределении OnPreInit

2- Элементы управления должны создаваться с одним и тем же идентификатором при каждом создании

Выполнение вышеизложенного гарантирует, что вся необходимая сантехника ASP.NET позаботится. Точка 1 гарантирует, что это происходит при каждом запросе / повторной публикации страницы, а точка 2 обеспечивает правильное отображение событий управления, состояния просмотра и т. Д.

1 голос
/ 21 декабря 2010

Ghosty,

Динамические элементы управления лучше всего создавать на этапе инициализации жизненного цикла страницы.Как упоминал Ричард, их также нужно создавать в каждом посте на странице.Я рекомендую помещать код в обработчик событий Page_Init, не обращая внимания на любые существующие проверки IsPostBack ().

См. здесь для большего понимания жизненного цикла страницы ASP.net.

Майк

0 голосов
/ 21 декабря 2010

ОК, теперь это работает, я вызвал метод IzpisXML () в разделе OnInit и просто изменил видимость Panel1 для отображения / скрытия надписей и кнопок.:)

Я хотел бы еще раз поблагодарить вас всех, вы все очень помогли! :)

Спасибо!

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