动态生成控件并取值

来源:互联网 发布:河南836软件孵化器 编辑:程序博客网 时间:2024/04/29 11:07

例子如下:

点击增加条件,会自动增加一行,如下:
代码如下:
        private void 增加条件button_Click(object sender, EventArgs e) 
        { 
            count += 1
            h += 26
            if (count > 7) MessageBox.Show(this"已经无法增加!!"); 
            else 
            { 
                ComboBox CBox1 = new ComboBox(); 
                for (int i = 0; i < Tablelength; i++) 
                    CBox1.Items.Add(TableCaption[i]); 
                CBox1.Left = 17
                CBox1.Top = h; 
                Size size1 = new Size(); 
                size1.Width = 109
                size1.Height = 20
                CBox1.Size = size1; 
                CBox1.Name = "字段comboBox" + count.ToString(); 
 //               CBox1.Click += new EventHandler(CBox1_Click); 
                this.panel1.Controls.Add(CBox1); 
                ComboBox CBox2 = new ComboBox(); 
                for (int i = 0; i < 8; i++) 
                    CBox2.Items.Add(Condition[i]); 
                CBox2.Left = 132
                CBox2.Top = h; 
                Size size2 = new Size(); 
                size2.Width = 62
                size2.Height = 20
                CBox2.Size = size2; 
                CBox2.Name = "条件comboBox" + count.ToString(); 
                this.panel1.Controls.Add(CBox2); 
                TextBox TBox3 = new TextBox(); 
                TBox3.Left = 200
                TBox3.Top = h; 
                Size size3 = new Size(); 
                size3.Width = 100
                size3.Height = 21
                TBox3.Size = size3; 
                TBox3.Name = "值textBox" + count.ToString(); 
                this.panel1.Controls.Add(TBox3); 
                ComboBox CBox4 = new ComboBox(); 
                for (int i = 0; i < 2; i++) 
                    CBox4.Items.Add(Logic[i]); 
                CBox4.Left = 307
                CBox4.Top = h; 
                Size size4 = new Size(); 
                size4.Width = 63
                size4.Height = 20
                CBox4.Size = size4; 
                CBox4.Name = "逻辑comboBox" + count.ToString(); 
                this.panel1.Controls.Add(CBox4); 
            } 
        } 
这样就完成了动态增加控件的功能,但是要获取值,又遇到问题!因为控件是动态生成的,原先不存在,所以不能以动态生成后的Name属性来获取.
以下是网上找到的两种获取方法:
一、
        private string find_1(int i) 
        { 
            return ((ComboBox)panel1.Controls.Find("字段comboBox" + i.ToString(), true)[0]).Text; 
        } 
        private string find_2(int i) 
        { 
            return ((ComboBox)panel1.Controls.Find("条件comboBox" + i.ToString(), true)[0]).Text; 
        } 
        private string find_3(int i) 
        { 
            return ((TextBox)panel1.Controls.Find("值textBox" + i.ToString(), true)[0]).Text; 
        } 
        private string find_4(int i) 
        { 
            string str = ((ComboBox)panel1.Controls.Find("逻辑comboBox" + i.ToString(), true)[0]).Text; 
            if (str == "并且") str = "and"; 
            else str = "or"
            return str; 
        } 
((ComboBox)panel1.Controls.Find("字段comboBox" + i.ToString(), true)[0]).Text;这条语句表示在panel1控件中找动态生成的子控件,Find()的第一个参数是控件名,第二个参数是布尔值。后面的“[0]”表示查找到的控件是一个数据,也就是有可能有多个,只选择第一个。
二、也可以用以下方法
       private string find_1(int i) 
        { 
            foreach (System.Windows.Forms.Control contr in panel1.Controls) 
            { 
 
                if (contr.Name.CompareTo("字段comboBox" + i.ToString()) == 0
                    return contr.Text; 
            } 
            return "0"
        } 
        private string find_2(int i) 
        { 
            foreach (System.Windows.Forms.Control contr in panel1.Controls) 
            { 
 
                if (contr.Name.CompareTo("条件comboBox" + i.ToString()) == 0
                    return contr.Text; 
            } 
            return "0"
        } 
        private string find_3(int i) 
        { 
            foreach (System.Windows.Forms.Control contr in panel1.Controls) 
            { 
 
                if (contr.Name.CompareTo("值textBox" + i.ToString()) == 0
                    return contr.Text; 
 
            } 
            return "0"
        } 
        private string find_4(int i) 
        { 
            foreach (System.Windows.Forms.Control contr in panel1.Controls) 
            { 
 
                if (contr.Name.CompareTo("逻辑comboBox" + i.ToString()) == 0
                { 
                    if(contr.Text=="并且") contr.Text="and"; 
                    else contr.Text="or"
                    return contr.Text; 
                } 
            } 
            return "0"
        } 
用foreach()语句来遍历panel1控件中的动态生成的子控件,如果找到相同名字的,就返回该控件的值
            foreach (System.Windows.Forms.Control contr in panel1.Controls) 
            { 
 
                if (contr.Name.CompareTo("字段comboBox" + i.ToString()) == 0
                    return contr.Text; 
            } 
            return "0"
有一个问题,我在编写时不能使用FindControl()这个函数!不知道为什么??
答:要使用类似的方法定义:System.Web.UI.WebControls.Button Button1;
      然后就可以使用Button1.FindControl()了。