在我的C#winforms应用程序中,我需要绘制块。这些块是所谓的过程块。所有块都在一起。有不同种类的过程块。此时我有三种处理块:A,B,C。当我绘制一个处理块时,它看起来像这样:
A
乙
乙
C
A
每个街区都有自己的背景颜色。每个街区都有自己的房产。例如:进程块A和B都具有相同的属性(ID和描述)。区别在于块的背景颜色。
我已经创建了一个用户控件。该用户控件是一个过程块。我已经有了一个picturebox,我将用户控件(进程块)添加到控件集合中。这很好用。关键是我不知道如何将A,B,C类型的进程块链接到用户控件。我也有一个propertygrid。单击过程块时,我想显示它的属性值。
我不确切知道如何实现这一点。我希望你能指出我正确的方向。
答案 0 :(得分:3)
我会看到您创建的UserControl是ProcessBlock
实例的'可视化工具'。
那么,我会做什么 - 给你提供的信息 - 是创建一个抽象类(或接口,它取决于)'ProcessBlock
',它有一些抽象方法,如GetDrawingColor
对于每个具体的ProcessBlock
,您将创建一个继承自抽象类(或接口)的新类。
那么,你可以拥有继承ProcessBlock基类的'ProcessBlockA','ProcessBlockB'和'ProcessBlockC'。
在每个具体的子类中,您覆盖GetDrawingColor
方法,以便它返回您想要的Color
。
然后,将ProcessBlock的实例传递给UserControl,UserControls调用GetDrawingColor
方法,并使用结果绘制它的背景。
例如:
public abstract class ProcessBlock
{
public abstract Color GetDrawingColor();
}
public class ProcessBlockA : ProcessBlock
{
public override Color GetDrawingColor()
{
return Color.Blue;
}
}
public class ProcessBockB : ProcessBlock
{
public override Color GetDrawingColor()
{
return Color.Red;
}
}
public ProcessBlockVisualizer : UserControl
{
private ProcessBlock _pb;
public ProcessBlockVisualizer( ProcessBlock pb )
{
_pb = pb;
this.BackgroundColor = _pb.GetDrawingColor();
this.Enter += (object sender, EventArgs e)=> this.PropertyGrid.Datasource = _pb;
}
}
答案 1 :(得分:1)
定义ProcessBlock抽象类型,定义进程块的属性,然后从ProcessBlock派生ProcessBlockA,B和C作为具体类型。 现在,您可以向用户控件添加ProcessBlock属性,并为每个属性分配流程类型的实例。
要允许在属性网格中编辑流程类型,只需将用户控件ProcessBlock分配给属性网格SelectedObject属性。
答案 2 :(得分:1)
public class ProcessProperties
{
public string PropertyName(){get; set;}
public string PropertyValue(){get; set;}
}
public class ProcessBlock
{
private List<ProcessProperties> _propList;
public List<ProcessProperties> propList(){get{return _propList;} set{this.Add(value);}}
}
ProcessBlock A = new ProcessBlock();
ProcessProperties pp = new ProcessProperties();
pp.PropertyName = "something";
pp.PropertyValue = "value of something";
A.propList = pp;
ProcessBlock B = new ProcessBlock();
ProcessProperties ppB = new ProcessProperties();
ppB.PropertyName = "something else";
ppB.PropertyValue = "value of something else";
B.propList = ppB;
像这样的东西。我不知道它是否会像我写的一样工作。通常将一个setter放在List类型的属性上是不正确的,但它可能会起作用。如果没有,那么以其他方式实例化List(例如使用构造函数)。
public class ProcessBlock
{
private List<ProcessProperties> _propList;
public List<ProcessProperties> propList(){get{return _propList;}}
public ProcessBlock(List<ProcessProperties> properties)
{ _propList = properties; }
}
答案 3 :(得分:0)
向控件添加属性以引用该过程。
单击时,将Process对象链接到属性网格,而不是控件本身。
(这是某种功课吗?)
答案 4 :(得分:0)
您可以构建一类“过程块”,例如:
public class processBlock
{
public int processID(){get; set;}
public Color processColor(){get; set;}
public string processName(){get; set;}
...other properties...
}
和
public List<processBlock> blockList = new List<processBlock>(new processBlock(processID = 1...));
并向控件添加一个属性,该属性将引用此类的某个实例。
构建一个onClick
方法,从列表中获取实例及其所有属性。