首页新闻找找看学习计划

如何将控件泛型化或者类化?

0
悬赏园豆:20 [待解决问题]

(C#)

先别急,听我说话,请看完再回复.
举个小例子,看图:
[img=http://img.bbs.csdn.net/upload/201305/17/1368773112_379070.jpg][/img]

如果我需要创建Button,Label,CheckBox中的任意一种控件,我只需要选中他们,这样我写出三个创建控件的方法,调用就OK了.看我的代码:
先将选中的CheckBox的text保存到List<string>中,遍历list判断:

 1         public void cbcreself(int i,List<string> list)
 2         {
 3             for (int j = 0; j < list.Count; j++)
 4             {
 5                 if (list[j].ToString() == "Button")
 6                 {
 7                     CreButton(i);//创建Button的方法
 8                 }
 9                 if (list[j].ToString()=="Label")
10                 {
11                     CreLabel(i);//创建Label的方法
12                 }
13                 if (list[j].ToString()=="CheckBox")
14                 {
15                     CreCheckBox(i);//创建CheckBox的方法
16                 }
17             }
18         }

创建Button的方法如下:

1        /// <summary>
 2         /// 创建Button
 3         /// </summary>
 4         public void CreButton(int count)
 5         {
 6             Button[] cre = new Button[count];
 7             for (int k = 0; k < cre.Length; k++)
 8             {
 9                 cre[k] = new Button();
10                 cre[k].Top = 10;
11                 cre[k].Location = new Point(20, k * 30 + 20);
12                 cre[k].Text = "btn" + k.ToString();
13                 this.gbRes.Controls.Add(cre[k]);
14             }            
15         }

    创建Label,CheckBox雷同.

    但是如果控件不仅仅有三个,假设无数个,针对不同种类的控件,不可能再去一一写出来.
我想到了C#中的泛型,类,反射.

    先说泛型,可不可以将这里的Button,Label,CheckBox...泛型呢?但是这样就出现一个问题,这里的Button,Label,CheckBox...都是有实际意义的,假设我们泛型了,当給各个控件 属性 赋值就会出现问题.

1                 cre[k] = new Button();//泛型了就不能new了,并且下面肯定也是没发赋值的
2                 cre[k].Top = 10;
3                 cre[k].Location = new Point(20, k * 30 + 20);
4                 cre[k].Text = "btn" + k.ToString();

    其次说一下类,用类的话,可以新建一个类,在里面写一个方法,但是类就是一个单纯的CS文件,我们怎么給诸如Button,Label,CheckBox.这样的控件赋属性值呢,因为在类中这些控件类型貌似都出不来,即使传递过来,是不是也没法赋属性呢.
     最后说一下反射,同样和泛型一样的问题,如何实例化,因为new不出来,反射出来的是一个诸如这些Button,Label,CheckBox..字符串,而不是真正的控件类型,强制转换么,貌似转换也不好使把.
     希望大家都能给我点建议和好的想法.

 

PS:为什么这里的上传图片控件,code控件都被公司屏蔽了,但是在后台发表随笔那里怎么没有被屏蔽.只能这样贴上代码了,被屏蔽也没办法.

flyher的主页 flyher | 初学一级 | 园豆:195
提问于:2013-05-17 15:28
< >
分享
所有回答(1)
0

泛型约束,你感受一下。

class Program
    {
        static void Main(string[] args)
        {

            var control = Create<System.Windows.Forms.TextBox>();

            Console.ReadKey();
        }

        public static T Create<T>()
            where T : System.Windows.Forms.Control, new()
        {
            var t = new T();
            t.Top = 1;
            t.Location = new System.Drawing.Point();
            t.Text = t.GetType().FullName;
            return t;
        }
    }
写代码的小2B | 园豆:4346 (老鸟四级) | 2013-05-17 15:43

泛型约束,感觉不就是对泛型经行限制么,但是为什么你会想到要用到这里呢?

看了一下,还是有点懵,

主要懵是因为这一行:

 public static T Create<T>()
           
where T : System.Windows.Forms.Control, new()

支持(0) 反对(0) flyher | 园豆:195 (初学一级) | 2013-05-20 17:00

@flyher: 

上面的代码是否解决了你的问题?

 

你的需求是创建Button,Label,Check这三个控件,这三个控件都从Control继承,并且都有无参构造函数。

从Control继承是限定基类,无参构造函数用于创建对象。

所以上面代码两个约束的意思是:类型T必须从Control继承;必须有无参构造函数。

支持(0) 反对(0) 写代码的小2B | 园豆:4346 (老鸟四级) | 2013-05-20 17:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册