none
关于动态添加控件 RRS feed

  • 问题

  • 如何在页面中动态添加控件(Label、Button、TextBox、DropDownList)以及它们的事件,在点击Button后如果获得TextBox.Text及DropDownList.SelectedValue的值?谢谢!

    2009年11月12日 4:33

答案

  • 比如:
    private TextBox textBox1;
    
    protected void Page_Load(object sender, EventArgs e)
    {
        this.textBox1 = new TextBox();
        this.Panel1.Controls.Add(this.textBox1);
    }

    或者使用 FindControl

    知识改变命运,奋斗成就人生!
    2009年11月12日 5:51
    版主
  • TextBox Txt = new TextBox();
    Txt.ID = "MyTxt";
    

    改为

    this.Txt = new TextBox();
    this.Txt.ID = "MyTxt";



    知识改变命运,奋斗成就人生!
    2009年11月12日 6:47
    版主

全部回复

  • 你好!

    动态添加的控件,需要在 PageLoad 或 Page_Init 事件中重新构造控件与它注册们的事件。

    知识改变命运,奋斗成就人生!
    2009年11月12日 5:38
    版主
  • 哦,我试一下,谢谢你的回复。
    2009年11月12日 5:38
  • 如何在代码中添加Page_Init事件?我是在Page_Load事件中添加的控件,页面上可以看到控件,在按钮的事件中,无法引用动态创建的TextBox的各种属性。在this.里根本就没有创建的TextBox。它就像是一个方法内私有成员一样,其他方法无法引用。
    2009年11月12日 5:44
  • 比如:
    private TextBox textBox1;
    
    protected void Page_Load(object sender, EventArgs e)
    {
        this.textBox1 = new TextBox();
        this.Panel1.Controls.Add(this.textBox1);
    }

    或者使用 FindControl

    知识改变命运,奋斗成就人生!
    2009年11月12日 5:51
    版主
  • 明白了,太谢谢你了。这样其他方法就可以引用了吧,谢谢你。
    2009年11月12日 5:52
  •     private TextBox Txt;
        protected void Page_Load(object sender, EventArgs e)
        {
            Create();
        }
        private void Create()
        {
            Button Btn = new Button();
            Btn.ID = "MyBtn";
            Btn.Text = "显示";
            Btn.CommandArgument = "MyBtn";
            Btn.Command += new CommandEventHandler(MyBtn_Command);

            TextBox Txt = new TextBox();
            Txt.ID = "MyTxt";
            this.FindControl("from1").Controls.Add(Btn);
            this.FindControl("from1").Controls.Add(Txt);
        }
        public void MyBtn_Command(object sender, CommandEventArgs e)
        {
            if (e.CommandArgument.ToString() == "MyBtn")
                Response.Write(Txt.Text);
        }


    这里出错:this.FindControl("from1").Controls.Add(Btn);
    错误信息:未将对象引用设置到对象的实例。

    2009年11月12日 6:12
  • 你这样可能容易一些,在界面上拖放一个 Panel ,通过 this.panel1.Controls.Add 来添加
    知识改变命运,奋斗成就人生!
    2009年11月12日 6:14
    版主
  • 嗯,我试一下。
    2009年11月12日 6:15
  • 这里错误找到原因了:this.FindControl("from1").Controls.Add(Btn);
    应该是:("form1")
    2009年11月12日 6:40
  •     private TextBox Txt;
        protected void Page_Load(object sender, EventArgs e)
        {
            Create();
        }
        private void Create()
        {
            Button Btn = new Button();
            Btn.ID = "MyBtn";
            Btn.Text = "显示";
            Btn.CommandArgument = "MyBtn";
            Btn.Command += new CommandEventHandler(this.MyBtn_Command);

            TextBox Txt = new TextBox();
            Txt.ID = "MyTxt";

            this.Panel1.Controls.Add(Btn);
            this.Panel1.Controls.Add(Txt);
        }
        public void MyBtn_Command(object sender, CommandEventArgs e)
        {
            if (e.CommandArgument.ToString() == "MyBtn")
                Response.Write(this.Txt.Text);
        }
    这里出错:Response.Write(this.Txt.Text);
    错误信息:未将对象引用设置到对象的实例。
    想想是不是由于页面刷新后,没有该实例造成的,怎么把代码写到Page_Init事件里呢?

    2009年11月12日 6:43
  • TextBox Txt = new TextBox();
    Txt.ID = "MyTxt";
    

    改为

    this.Txt = new TextBox();
    this.Txt.ID = "MyTxt";



    知识改变命运,奋斗成就人生!
    2009年11月12日 6:47
    版主
  • 你太棒了,谢谢。
    2009年11月12日 6:48
  • 此贴问题已完满解决。

    问题总结:
    页面内动态创建控件----完成。
    控件事件响应----完成。
    页面内引用控件属性----完成。

    特此感谢版主X.X.Y所给予的热情帮助,再次感谢你!

    最后附上无错代码:(希望给跟我一样的初学者帮助)

        private TextBox Txt;
    
        protected void Page_Load(object sender, EventArgs e)
        {
            Create();
        }
    
        private void Create()
        {
            Button Btn = new Button();
            Btn.ID = "MyBtn";
            Btn.Text = "显示";
            Btn.CommandArgument = "MyBtn";
            Btn.Command += new CommandEventHandler(this.MyBtn_Command);
    
            this.Txt = new TextBox();
            this.Txt.ID = "MyTxt";
    
            this.FindControl("form1").Controls.Add(Btn);
            this.FindControl("form1").Controls.Add(Txt);
        }
    
        public void MyBtn_Command(object sender, CommandEventArgs e)
        {
            if (e.CommandArgument.ToString() == "MyBtn")
                Response.Write(Txt.Text);
        }
    
    2009年11月12日 6:54
  • 不用客气啊~
    知识改变命运,奋斗成就人生!
    2009年11月12日 7:05
    版主
  • 呵呵~~我又回来了。怎么样才能让生成的控件一行一个呢?就是我想让控件竖着排。
    2009年11月12日 8:34
  • 比较简单的方式是使用表格控制,服务端控件有个Table 你去试试吧。
    知识改变命运,奋斗成就人生!
    2009年11月12日 8:37
    版主
  • 嗯,好的。
    2009年11月12日 8:38