C#实施过程块

C#实施过程块,c#,winforms,oop,C#,Winforms,Oop,在我的C#winforms应用程序中,我需要绘制块。这些块称为过程块。所有模块一起是一个过程。有不同类型的进程块。此时,我有三种进程块:A、B、C。当我绘制进程块时,它如下所示: A B B C A 每个街区都有自己的背景色。每个块都有自己的属性。例如:流程块A和B都具有相同的属性(ID和描述)。差异是块的背景色 我已经创建了一个用户控件。此用户控件是一个进程块。我已经有了一个picturebox,其中我将用户控件(进程块)添加到控件集合中。这个很好用。关键是我不知道如何将类型为a、B、C的进程

在我的C#winforms应用程序中,我需要绘制块。这些块称为过程块。所有模块一起是一个过程。有不同类型的进程块。此时,我有三种进程块:A、B、C。当我绘制进程块时,它如下所示:

A

B

B

C

A

每个街区都有自己的背景色。每个块都有自己的属性。例如:流程块A和B都具有相同的属性(ID和描述)。差异是块的背景色

我已经创建了一个用户控件。此用户控件是一个进程块。我已经有了一个picturebox,其中我将用户控件(进程块)添加到控件集合中。这个很好用。关键是我不知道如何将类型为a、B、C的进程块链接到用户控件。我还有一个不动产网格。单击processblock时,我希望显示它的属性值


我不知道该如何实现这一点。我希望您能为我指出正确的方向。

向控件添加属性以引用进程

单击时,将流程对象链接到属性网格,而不是控件本身


(这是某种作业吗?

向控件添加属性以引用进程

单击时,将流程对象链接到属性网格,而不是控件本身


(这是一种家庭作业吗?

我会看到您创建的用户控件,它是
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),;
公共列表专业版