精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
C#可以方便地设计开发自定义控件,扩充UI处理能力。自定义控件可以从UserControl类派生,也可以从界面控件派生比如Panel,但是有些细节问题要注意避免,今天就把一个心得告诉大家。
在项目里用Panel模拟实现一个竖排的树形控件,但是代码写好后,在主项目里打开Form窗体,在工具箱里就是找不到自定义控件,很是奇怪,别的自定义控件都能看到就这个不行。我重新编译了DLL项目不行,想找VS2010刷新项目工具箱菜单,但是菜单禁止,不能用,把我急的不行。
查来查去,突然想到类的访问权限修饰符,一检查,发现确实不是public,是internal,类似:
internal partial class MyPanel : System.Windows.Forms.Panel
哪天因为是手写代码,通过向导直接建立的类,手写时忽略修改了修饰符,导致了问题。一般用向导创建UserControl不会出现这情况,就是想用某些控件类派生时会导致此问题。
internal 修饰符使类、接口或成员仅在当前包中可见。 当前包之外的代码不能访问 internal 成员。 类和接口可以使用 internal 修饰符来标记。 在全局范围内, internal 修饰符与 public 修饰符相同。 类或接口的任何成员都可以使用 internal 修饰符来标记。 不能将 internal 修饰符与其他任何可见性修饰符( public、 private 或 protected)组合。 可见性修饰符相对于它们的定义范围。例如,不能公开访问 internal 类的 public 方法,但任何具有该类访问权的代码都可以访问该方法。
主项目是一个包,DLL项目是一个包,用internal就会导致主项目看不到DLL项目里的这个MyPanel类,看不到,自然让工具箱没反应。