C # Реализация блоков процесса - PullRequest
1 голос
/ 06 января 2010

В моем приложении C # winforms мне нужно рисовать блоки. Эти блоки являются так называемыми блоками процесса. Все блоки вместе - это процесс. Существуют разные виды технологических блоков. На данный момент у меня есть три вида блоков процесса: A, B, C. Когда я рисую блок процесса, он выглядит так:

A

B

B

C

A

Каждый блок имеет свой собственный цвет фона. И у каждого блока есть свои свойства. Например: блоки процесса A и B оба имеют одинаковые свойства (идентификатор и описание). Разница заключается в цвете фона блока.

Я уже создал пользовательский элемент управления. Этот пользовательский элемент управления является блоком процесса. У меня уже есть картинка, где я добавляю пользовательский элемент управления (блоки процессов) в коллекцию элементов управления. Это отлично работает. Дело в том, что я не знаю, как связать блок процесса типа A, B, C с пользовательским элементом управления. У меня также есть сетка свойств. При щелчке по блоку процесса я хочу отобразить значения его свойств.

Я не знаю точно, как это реализовать. Я надеюсь, что вы можете указать мне правильное направление.

Ответы [ 5 ]

3 голосов
/ 06 января 2010

Я бы увидел созданный вами UserControl как «визуализатор» экземпляра ProcessBlock.

Итак, что бы я сделал - учитывая предоставленную вами информацию - это создание абстрактного класса (или интерфейса, это зависит) 'ProcessBlock', который имеет некоторые абстрактные методы, такие как GetDrawingColor.

Для каждого конкретного ProcessBlock вы создаете новый класс, который наследуется от абстрактного класса (или интерфейса). Таким образом, у вас могут быть ProcessBlockA, ProcessBlockB и ProcessBlockC, которые наследуются от базового класса ProcessBlock. В каждом конкретном подклассе вы переопределяете метод 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 голос
/ 06 января 2010
    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;

Примерно так. Я не знаю, будет ли это работать так же, как я написал. обычно установка метода set для свойства типа List не является правильной, но это может сработать. если он не установит List другим способом (например, с помощью конструктора).

public class ProcessBlock
    {
        private List<ProcessProperties> _propList;
        public List<ProcessProperties> propList(){get{return _propList;}}
        public ProcessBlock(List<ProcessProperties> properties)
        { _propList = properties; }
    }
1 голос
/ 06 января 2010

Определите абстрактный тип ProcessBlock, который определяет свойства блока процесса, а затем выведите ProcessBlockA, B и C из ProcessBlock как конкретные типы.Теперь вы можете добавить свойство ProcessBlock в свой пользовательский элемент управления и назначить экземпляры типов процессов каждому.

Чтобы разрешить редактирование типа процесса в сетке свойств, вы просто назначаете пользовательские элементы управления ProcessBlock в свойствах сетки.

0 голосов
/ 06 января 2010

Вы можете создать класс «блоков процесса», например:

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 метод, который будет получать экземпляр из списка и все его свойства.

0 голосов
/ 06 января 2010

Добавьте свойство в элемент управления для ссылки на процесс.

При нажатии связать объект Process с сеткой свойств, а не с самим элементом управления.

(это какая-то домашняя работа?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...