C#中如何动态实例控件?(在线等候)

主  题:  C#中如何动态实例控件?(在线等候)
作  者:  yangzhiguo (小楊)
等  级:  ^
信 誉 值:  100
所属论坛:  .NET技术 C#
问题点数:  50
回复次数:  10
发表时间:  2003-10-10 15:03:14

我想在文本框输入一个字串(如:"textBox1"),然后点击命令钮时就创建textBox1的实例。也就是直接根据文本框中输入的字串创建实例!(动态创建的那种)。



回复人: prettysammi(旻) ( 一级(初级)) 信誉:100 2003-10-10 16:05:51 得分:0

if(TextBox1.Text!="")
{
    TextBox t1=new TextBox();
    t1.ID=TextBox1.Text;
    TableRow tr=new TableRow();
    TableCell td=new TableCell();
    td.Controls.Add(t1);
    tr.Cells.Add(td);
    Table1.Rows.Add(tr);
}

回复人: snof(雪狼) ( 两星(中级)) 信誉:105 2003-10-10 16:10:34 得分:0

if(this.TextBox1.Text != "")
{
    TextBox t = new TextBox();
    t.Name = this.TextBox.Text;
    t.Location = new point(100,200);
    t.Size = new Size(20,20);
    this.Controls.Add(t);
}

回复人: BLGT(菠萝@罐头) ( 二级(初级)) 信誉:100 2003-10-10 16:22:39 得分:0

楼主的意思是不是:如果输入“button"也可以新建一个按钮,按照输入的文字建立控件?
如果是的话我只好帮你顶了

回复人: acxw(小文) ( 二级(初级)) 信誉:99 2003-10-10 16:23:28 得分:0

http://www.yesky.com/SoftChannel/72342380468109312/20020114/213862.shtml

看看这个咯

原理是差不多的拉

回复人: sgsh51(共同进步) ( 三级(初级)) 信誉:100 2003-10-10 16:52:01 得分:0

老实说这样做几乎很难实现,
首先你就输入一个字符串"TextBox1",编译器根本就只是把它当作一个字符串处理,这样是不可能实现的。
如果你能再有一个字段入表名它是什么类型的控件,如"TextBox",
那么用反射中的InvokeMemeber()还是可以实现的

回复人: wideroad() ( 三级(初级)) 信誉:100 2003-10-10 17:12:50 得分:0

楼上说得怎么这么高深阿,prettysammi(旻)说得就对!!!

回复人: qqq123(qqq123) ( 三级(初级)) 信誉:100 2003-10-10 19:38:22 得分:50

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace CreateControl
{
    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
        private System.Windows.Forms.TextBox textBox1;
        private System.Windows.Forms.Button button1;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        public Form1()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.button1 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(328, 16);
            this.textBox1.Name = "textBox1";
            this.textBox1.TabIndex = 0;
            this.textBox1.Text = "textBox1";
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(448, 16);
            this.button1.Name = "button1";
            this.button1.TabIndex = 1;
            this.button1.Text = "button1";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // Form1
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(536, 342);
            this.Controls.Add(this.button1);
            this.Controls.Add(this.textBox1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.Run(new Form1());
        }

        private Point _location = new Point(0, 0);

        private void button1_Click(object sender, System.EventArgs e)
        {
            Type type = Type.GetType(this.textBox1.Text);
            if (type == null)
                type = Type.GetType("System.Windows.Forms." + this.textBox1.Text + ",System.Windows.Forms,Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
            if (type == null) return;
            if (typeof(Control).IsAssignableFrom(type))
            {
                Control control = System.Activator.CreateInstance(type, false) as Control;
                if (control == null) return;
                control.Location = this._location;
                this._location.X += 10;
                this._location.Y += 10;
                this.Controls.Add(control);
            }
        }
    }
}

回复人: sgsh51(共同进步) ( 三级(初级)) 信誉:100 2003-10-10 20:39:44 得分:0

我想知道楼主的意思是不是只要在TextBox框中输入一个字符串就产生一个相应的实例?
比如如你所说输入一个"TextBox1"就产生一个TextBox的实例,且ID为TextBox1,如果真是想这样的话,那我就有几个问题想问你?
第一:光根据一个字符串你怎么来判断它生成的是什么类型的控件,就如你所说的,输入一个“Button1"就应该要生成Button的控件实列,输入一个“Label1"就应该生成一个Label的空间实例!
第二:或许你可以通过截取字符串来判定你要生成为什么控件的类型,比如"TextBox1"你可以截取出TextBox,从而知道它是一个TextBox类型的控件,但是现在截取的还是字符串,这时要么用switch case (这样的话,扩展性极差级差),还是最终会选择反射。
讲了这些我也不知道是不是理解错了你的意思,我只说了说我的想法

回复人: yangzhiguo(小楊) ( 一级(初级)) 信誉:100 2003-10-13 9:14:30 得分:0

我的意思是:
现在FORM上有N个TEXTBOX控件,名为"TEXT1","TEXT2"..."TEXTN",我要给这N个控件赋值.不知哪有比较好的办法.

回复人: hai4(敏敏) ( 二级(初级)) 信誉:100 2003-10-13 11:20:18 得分:0

用反射一定能实现,如:InvokeMember(...),里面有很多参数,你看一下MSDN,找到你要的那个方法。

该问题已经结贴 ,得分记录: qqq123 (50)、

Contributors: FHL