【问题标题】:C# Custom Control PropertiesC# 自定义控件属性
【发布时间】:2016-01-03 23:09:21
【问题描述】:

我正在构建一些使用 OPC 来控制某些工业自动化的应用程序。我已经决定为我将使用的标准事物(例如按钮和文本框)创建一些自定义控件可能是一个好主意。我的主要原因之一是我觉得最终对象是一种理想的模式,即按钮是保存有关它所引用的 OPC 项目信息的人,否则在典型的应用程序中,我的 Form 类会被我的大量变量污染头脑的范围比他们应该的更全球化。然后我开始使用按钮的 Tag 属性,但这需要一些对于每个实例都相同的开销代码。我觉得正确的做法是子类化我想使用的控件并提供属性来配置每个控件。

考虑到这种情况,我真正的问题是这个。为了使其尽可能便携,我决定应该有一个属性来定义 OPC 组。我声明了这样的属性

public class OPCButton : Button  
{  
    [Category("OPC")]
    public OPCConnectedGroup
    {
        get { return _OPCGroup; }
        set { _OPCGroup = value; }
    }
}

当我添加控件时,这会显示在属性列表中,但即使我的 Form1 包含,我也无法绑定此属性

public OPCConnectedGroup Connection1 = new OPCConnectedGroup();

我已经决定解决这个问题的方法可能是创建一个额外的控件,例如 OPCGrp,可以添加到表单中,然后控件可以引用它。为了进行测试,我添加了一个 Button 类型的属性,当我添加它并浏览到该属性时,它确实为我提供了表单上所有按钮的选项。我对这种方法没有什么大问题我只是想确保我遵循原型模式,因为我将负责维护控制库但并不总是实施并且我试图将其简化为 1-2 步过程来实施一个控件。

谢谢 马特

【问题讨论】:

标签: c# .net properties custom-controls


【解决方案1】:

定义OPCConnectedGroup时可以继承Component类。

这样,如果您的OPCButton 中有OPCConnectedGroup 类型的属性,那么在设计时,您可以将OPCConnectedGroup 的实例放在表单上,​​然后如果您在设计器中选择OPCButtonOPCConnectedGroup 类型的该属性将显示为一个下拉列表,您可以从中选择一个您在表单上为其放置的实例。

例子:

如果我有这样的MyButtonMyClass

public class MyButton : Button
{
    public MyClass MyClassInstance { get; set; } 
}

public class MyClass : Component
{
   public string SomeProperty {get;set;}
}

然后您可以将MyClass 的一些(或一个)实例放在表单的组件托盘上:

然后,如果您在表单上选择 MyButton,您可以从属性网格中选择 MyClass 实例之一:

【讨论】:

  • 谢谢 这基本上是我所期望的,但很高兴听到其他人的消息。我也没有意识到要继承 Component。我以为我必须继承典型的 Control
  • 不客气。组件更适合这种情况,因为它们重量轻且不可见。
  • 如果我希望我的组件成为程序范围而不是表单范围,那么最好的方法是什么?我突然想到需要在该表单上创建组件,我想避免像OPCConnectedGroup.SetGroup(IOPCGroup)
  • 如果你想在设计器中使用一个组件,那么该组件的范围是Form。但是您的组件可以共享存储在静态属性中某处的东西。 Somewhere 可以是不同的类或相同的组件类。
猜你喜欢
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 2014-11-26
  • 2013-03-28
  • 1970-01-01
相关资源
最近更新 更多