C#实施过程块
在我的C#winforms应用程序中,我需要绘制块。这些块称为过程块。所有模块一起是一个过程。有不同类型的进程块。此时,我有三种进程块:A、B、C。当我绘制进程块时,它如下所示: A B B C A 每个街区都有自己的背景色。每个块都有自己的属性。例如:流程块A和B都具有相同的属性(ID和描述)。差异是块的背景色 我已经创建了一个用户控件。此用户控件是一个进程块。我已经有了一个picturebox,其中我将用户控件(进程块)添加到控件集合中。这个很好用。关键是我不知道如何将类型为a、B、C的进程块链接到用户控件。我还有一个不动产网格。单击processblock时,我希望显示它的属性值C#实施过程块,c#,winforms,oop,C#,Winforms,Oop,在我的C#winforms应用程序中,我需要绘制块。这些块称为过程块。所有模块一起是一个过程。有不同类型的进程块。此时,我有三种进程块:A、B、C。当我绘制进程块时,它如下所示: A B B C A 每个街区都有自己的背景色。每个块都有自己的属性。例如:流程块A和B都具有相同的属性(ID和描述)。差异是块的背景色 我已经创建了一个用户控件。此用户控件是一个进程块。我已经有了一个picturebox,其中我将用户控件(进程块)添加到控件集合中。这个很好用。关键是我不知道如何将类型为a、B、C的进程
我不知道该如何实现这一点。我希望您能为我指出正确的方向。向控件添加属性以引用进程 单击时,将流程对象链接到属性网格,而不是控件本身
(这是某种作业吗?向控件添加属性以引用进程 单击时,将流程对象链接到属性网格,而不是控件本身
(这是一种家庭作业吗?我会看到您创建的用户控件,它是
ProcessBlock
实例的“可视化工具”
因此,根据您提供的信息,我要做的是创建一个抽象类(或接口,具体取决于)ProcessBlock
,它有一些抽象方法,如GetDrawingColor
对于每个具体的ProcessBlock
,您都会创建一个从抽象类(或接口)继承的新类。
因此,您可以使用从ProcessBlock基类继承的“ProcessBlockA”、“ProcessBlockB”和“ProcessBlockC”。
在每个具体的子类中,您重写GetDrawingColor
方法,以便它返回您想要的Color
然后,将ProcessBlock的一个实例传递给UserControl,UserControl调用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;
}
}
我将看到您创建的UserControl,它是
ProcessBlock
实例的“可视化工具”
因此,根据您提供的信息,我要做的是创建一个抽象类(或接口,具体取决于)ProcessBlock
,它有一些抽象方法,如GetDrawingColor
对于每个具体的ProcessBlock
,您都会创建一个从抽象类(或接口)继承的新类。
因此,您可以使用从ProcessBlock基类继承的“ProcessBlockA”、“ProcessBlockB”和“ProcessBlockC”。
在每个具体的子类中,您重写GetDrawingColor
方法,以便它返回您想要的Color
然后,将ProcessBlock的一个实例传递给UserControl,UserControl调用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;
}
}
定义一个ProcessBlock抽象类型,该类型定义进程块的属性,然后从ProcessBlock派生ProcessBlockA、B和C作为具体类型。 现在,您可以向用户控件添加ProcessBlock属性,并为每个控件分配进程类型的实例
要允许编辑属性网格中的流程类型,只需将用户控件ProcessBlock指定给属性网格SelectedObject属性。定义定义流程块属性的ProcessBlock抽象类型,然后从ProcessBlock派生ProcessBlockA、B和C作为具体类型。 现在,您可以向用户控件添加ProcessBlock属性,并为每个控件分配进程类型的实例
要允许编辑属性网格中的流程类型,只需将用户控件ProcessBlock分配给属性网格SelectedObject属性。您可以构建一类“流程块”,类似于:
public class processBlock
{
public int processID(){get; set;}
public Color processColor(){get; set;}
public string processName(){get; set;}
...other properties...
}
及
public List blockList=新列表(新processBlock(processID=1…);
并向控件添加一个属性,该属性将引用此类的某个实例
并构建一个
onClick
方法,该方法将从列表中获取实例及其所有属性。您可以构建一类“进程块”,类似于:
public class processBlock
{
public int processID(){get; set;}
public Color processColor(){get; set;}
public string processName(){get; set;}
...other properties...
}
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;
及
public List blockList=新列表(新processBlock(processID=1…);
并向控件添加一个属性,该属性将引用此类的某个实例
并构建一个onClick
方法,该方法将从列表中获取实例及其所有属性。公共类ProcessProperties
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;
{
公共字符串PropertyName(){get;set;}
公共字符串PropertyValue(){get;set;}
}
公共类进程块
{
私人名单(propList),;
public List propList(){get{return}propList;}set{this.Add(value);}
}
ProcessBlock A=新的ProcessBlock();
ProcessProperties pp=新的ProcessProperties();
pp.PropertyName=“某物”;
pp.PropertyValue=“某物的价值”;
A.propList=pp;
ProcessBlock B=新的ProcessBlock();
ProcessProperties ppB=新的ProcessProperties();
ppB.PropertyName=“其他”;
ppB.PropertyValue=“其他事物的价值”;
B.propList=ppB;
像这样的。我不知道它是否会像我写的那样工作。通常,将setter放在List类型的属性上是不正确的,但它可能会起作用。如果没有,则以其他方式重新设置列表(例如使用构造函数)
公共类进程块
{
私人名单(propList),;
公共列表专业版