c#windows窗体 怎么给用户控件传递泛型类

怎么给用户控件传递泛型类
其实就是想实现传DataGridView控件名和数据模型实例就可以实现绑定不同DataGridView和不同list<model>实例就可以控制DataGridView分页的自定义控件

真是越说越远了,汗一个。

看到你的用户控件代码中的partial了么,
public partial class pageChangeByLinklabel<T>:UserControl

partial说明此类还有一半在另外的cs文件中,正是系统替你写好的pageChangeByLinklable.designer.cs

去那边把类签名也改成泛型版就好了。找不到InitializeComponent方法是因为此方法由系统自己成成,丢在那边了。

此外,给用户控件(或者说一个类)传类型参数真的是有很多种方法。
一、在类说明上直接用泛型声明
二、在类的构造中加入参数(Type t),准确的说不是泛型但是用法类似。
三、在类中加一个设置参数的方法,此方法可以写成泛型版。
四、在类中加一个设置参数的方法,传入参数Type t。
五、向类中传T类型的实例instance,类中自己保存typeof(instance)。
等等……追问

请问大神
按照你上面那个方法,没有错了,不过由于在类名后面加了,不能生自定义控件的dll包,
--四、在类中加一个设置参数的方法,传入参数Type t。Type参数自能够匹配字段类型,不能匹配内类型,
怎么弄一个属性,用来获得类型还是不知道

追答

    实际上如果你一定要在UserControl中改签名的话,只要你在设计器使用了任何资源(如图片等),一定会报错的,因为设计器根本不能识别泛型扩展的用户控件。

    “Type参数自能够匹配字段类型,不能匹配内类型”我不知道你“内类型”具体指什么。仅一般用途来说,在用户控件中维护一个private Type myType;随便怎么传都可以。

    public void SetType(Type myType){this.myType=myType;}足够了。有了myType,虽然没有泛型T这样用起来方便,但是完全可以做一样的工作,比如返回一个myType类型的值之类。


此外想请你说明一下为什么一定要在用户控件类上用泛型?很多需求都可以有实现捷径的。

追问

我想要在外面传设置typeModel就可以给调用

bindDataGridViewByList(DTGV,tlist,5,frist,up,next,last);方法

追答

原来如此。不管你传入的泛型/类型是什么,你总之是用它来生成new List。如果tlist本身就是控件内的私有成员且SetModel是控件的公共方法,这样写不就好了:
public void SetModel()
{
this.tlist=new List();

}
缺点是T的有效范围仅在SetModel方法内部。如果你在控件内其他方法想返回T的实例是没有办法的,只能用object替代。

追问

追答

过长请私信、

温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-01-19
兄弟,最后怎么解决的?
第2个回答  2014-03-24
重载构造函数追问

主要是在类名后后构造函数InitializeComponent();不能执行,不能初始化组件

追答

T是类型 你知定下类型就行了
public Form1(List list)
{
InitializeComponent();
}

追问

不知道怎么弄  报错:山下文中不存在 InitializeComponent;

重载后也不行

追答

- - 重载构造方法,你那是类 public pageChangeByLinklable(List list){......}

追问

总是这条语句通不过

关键问题是这是用户控件,我想通过做一个属性传类类型进去

追答

把你类上面的去掉

追问

去掉怎么传类型进去。

相似回答