Button不想调用方法(ASP.NET - C#)

时间:2010-12-21 14:09:11

标签: c# asp.net button

首先,我要感谢您抽出宝贵时间阅读我的问题,也许还能帮到我。 :)

现在我的问题......我正在使用C#代码创建新按钮并将它们附加到名为Panel1的Panel中:

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)。

我真的很感谢任何建议解决方案。


好的,现在我创建了以下内容:

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 个答案:

答案 0 :(得分:5)

创建动态控件时,需要在每次回发时重新创建。

请参阅here

答案 1 :(得分:1)

Ghosty,

动态控件最好在Page生命周期的Init阶段创建。正如理查德所提到的,他们还需要在页面的每个帖子上创建。我建议将代码放在Page_Init事件处理程序中,确保将其放在任何现有的IsPostBack()检查之外。

有关ASP.net页面生命周期的更多信息,请参阅here

麦克

答案 2 :(得分:1)

在ASP.NET中创建动态控件时的关键点是

1-控件应该在OnInit中创建,或者更好地覆盖OnPreInit

2-每次创建时都应使用相同的ID创建控件

执行上述操作将确保所有必要的ASP.NET管道都得到处理。第1点将确保在每个页面请求/回发时发生这种情况,第2点确保控制事件和视图状态等正确映射。

答案 3 :(得分:0)

好的,它现在正在工作,我在OnInit部分调用了IzpisXML()方法,只是更改了Panel1的可见性以显示/隐藏标签&amp;纽扣。 :)

我再次感谢你们,你们都给了我很大帮助! :)

谢谢!