Алгоритм добавления ссылок на независимого мастера для основной формы редактирования и детейлов, примеры использования

Существует два способа добавить на форму редактирования Lookup для выбора объекта, несвязанного с редактируемым на текущей форме:

  1. Добавить вычислимое поле в основной объект и перегенерировать форму с помощью Flexberry Desinger.
  2. В коде приложения добавить Lookup на форму.

Алгоритм добавления LookUp в коде приложения

  • Добавить на форму LookUp-контрол.
  • Создать еще один EditManager.
  • Приписать LookUp к созданному EditManager в методе TuneLookupInformation, а также добавить соответсвующую запись в метод GetRunners().
  • Добавить в конец пути контрола “(GroupEditBase)”.

Пример вызова независимого списка мастеровых объектов

На примере показано, как можно вызвать на лукап список объектов, не имеющих связей c объектом-инициатором и не являющихся мастером для какого-либо другого объекта в модели предметной области:

  • вызывается списочная форма объектов для выбора,
  • процедуре вызова этой формы передаётся класс и название свойства этого класса, значением которого является объект класса, выбираемый на форме.

Если такого класса нет, то его следует создать.

Пример

Есть класс Реагирование и не связанный с ним (отношениями ассоциации или композиции) класс ДежурнаяГруппа.

С формы редактирования Реагирования требуется вызвать список дежурных групп для размазывания свойств конкретной выбранной дежурной группы по свойствам Реагирования (точнее, добавления соответствующих детейлов).

В модели нет класса, который содержал бы ссылку на дежурную группу, соответственно, его необходимо доьавить:

1.Создать класс внутри формы Реагирования (где осуществляется вызов списка). Объект должен быть нехранимым. Таким образом не требуеся менять модель на диаграмме, так как класс ннеобходим только для LookUp.

public class WinformРеагированиеE : ICSSoft.STORMNET.UI.BaseWinEdit, ICSSoft.AMS02.Происшествия.DPDIРеагированиеE
{
    // .....

    [AutoAltered()]
    [NotStored()]
    class Временный_ДежурнаяГруппа : ICSSoft.STORMNET.DataObject
    {
        private Объекты.ДежурнаяГруппа fДЖ = null;
        public virtual Объекты.ДежурнаяГруппа ДЖ
        {
            get
            {
                return fДЖ;
            }
            set
            {
                fДЖ = value;
            }
        }
    }

    //.....
}

2.Для кнопки открытия списка добавляется следующее:

  string propertyName = "ДЖ";
  string contPath = "";
  base.OnEdit(propertyName, new Временный_ДежурнаяГруппа(), contPath, null);

propertyName - имя свойства класса, который передаётся вторым параметром (в данном случае Временный_ДежурнаяГруппа), в который вернётся выбранный элемент.

Применимо в случае, если класс хранимый, т.к. возврат параметров происходит через SaveEvent.

Чтобы этого избежать следует:

  {
    object form = null;
    System.Type FormType = null;
    ICSSoft.STORMNET.DataObject dobj = null;
    string propertyName = "ДЖ";

    FormType = System.Type.GetType("ICSSoft.AMS02.Происшествия.ДежурнаяГруппаL,Происшествия(Forms)");

    Временный_ДежурнаяГруппа FL = new Временный_ДежурнаяГруппа();
    //FL.ДЖ = ...;
    dobj = FL;

    form = ICSSoft.STORMNET.UI.ContRunner.RunForm(FormType);
    if (form is ICSSoft.STORMNET.UI.BaseIndpdList)
    {
      (form as ICSSoft.STORMNET.UI.BaseIndpdList).SaveEvent += new ICSSoft.STORMNET.UI.SaveEventArgsHandler(OnReturnFromList);
      (form as ICSSoft.STORMNET.UI.BaseIndpdList).Edit(dobj, "", propertyName, null);
    }
  }

  Объекты.ДежурнаяГруппа ДежурГр;

  private void OnReturnFromList(object sender, ICSSoft.STORMNET.UI.SaveEventArgs e)
  {
    this.ДежурГр = ((Временный_ДежурнаяГруппа)e.dataobject).ДЖ;
  }

3.Подписаться на созданный обработчик сохранения и дописать все необходимые операции. Если FL.ДЖ присвоить конкретное значение, то в списке будет подсвечен (выбран) этот элемент.

Использование в GroupEdit

Например, есть класс ДежурнаяГруппаСмены и не связанный с ним (отношениями ассоциации или композиции) класс ДежурнаяГруппа. По лукапу номера группы нужно вызвать список ДежурныхГрупп для заполнения полей ДежурнойГруппыСмены из свойств выбранной ДежурнойГруппы.

Для этого:

  • В методе GetControl класса CustomControlProvide устанавить контрол для поля НомерГруппы:
            if (view.Name #  "ДежурнаяГруппаСменыE" && propertyName  "НомерГруппы")
            {
                ICSSoft.STORMNET.Windows.Forms.LookUp lookUp = new ICSSoft.STORMNET.Windows.Forms.LookUp();

                ctrl = new ICSSoft.STORMNET.Windows.Forms.Binders.ControlForBindStruct(lookUp, "Value");
            }
  • Переопределить метод OnEdit в winformДежурнаяСменаE. Так как класс ДежурнаяГруппаСмены не имеет ссылки на ДежурнуюГруппу, то выбрать любой другой класс, имеющий такую ссылку, например, ЧленДежурнойГруппы.
dataobject = new ЧленДежурнойГруппы(); //класс, имеющий ссылку на дежурную группу
propertyname = "ДежураяГруппа"; //имя ссылки

public override void OnEdit(string propertyname, ICSSoft.STORMNET.DataObject dataobject, string contpath, object tag)
        {
            if (dataobject is ДежурнаяГруппаСмены && propertyname == "ДежурныеГруппыСмены.НомерГруппы")
            {
                if (((ДежурнаяГруппаСмены)dataobject).ТипДежурнойГруппы != null)
                {
                    tag = FunctionBuilder.BuildEquals("ТипДежурнойГруппы", ((ДежурнаяГруппаСмены)dataobject).ТипДежурнойГруппы);
                }
                dataobject = new ЧленДежурнойГруппы();
                propertyname = "ДежураяГруппа";
            }

            base.OnEdit(propertyname, dataobject, contpath, tag);
        }
  • Переопределить метод Edited в winformДежурнаяСменаE. Записываем все необходимые свойства в ДежурнуюГруппуСмены из выбранной ДежурнойГруппы:
public override void Edited(ICSSoft.STORMNET.DataObject dataobject, string contpath, string propertyname)
        {
            base.Edited(dataobject, contpath, propertyname);

            if (dataobject is ЧленДежурнойГруппы && propertyname == "ДежураяГруппа")
            {
                ДежурнаяГруппаСмены ДежГрСмены = (ДежурнаяГруппаСмены)ДежурныеГруппыСмены.EditManager.DataObject;
                ДежурнаяГруппа ДежГр = ((ЧленДежурнойГруппы)dataobject).ДежураяГруппа;
                ICSSoft.STORMNET.Business.DataServiceProvider.DataService.LoadObject("ДежурнаяГруппаE", ДежГр);
                ДежГрСмены.НомерГруппы = ДежГр.НомерГруппы;
                ДежГрСмены.ТипДежурнойГруппы = ДежГр.ТипДежурнойГруппы;
                ДежГрСмены.Руководитель = ДежГр.Руководитель;
                ДежГрСмены.Комментарий = ДежГр.Комментарий;
                ДежГрСмены.Позывной = ДежГр.Позывной;
                ДежГрСмены.ЧленыДежГруппыСмены.Clear();

                for (int t = 0; t < ДежГр.ЧленыДежурнойГруппы.Count; t++)
                {
                    Объекты.ЧленДежурнойГруппы членДежГр = ДежГр.ЧленыДежурнойГруппы[t];
                    Объекты.ЧленДежГруппыСмены чдгс = new Объекты.ЧленДежГруппыСмены();
                    чдгс.ДежурнаяГруппаСмены = ДежГрСмены;
                    чдгс.НомерПП = членДежГр.НомерПП;
                    чдгс.Сотрудник = членДежГр.Сотрудник;
                    чдгс.Позывной = членДежГр.Позывной;
                    ДежГрСмены.ЧленыДежГруппыСмены.Add(чдгс);
                }
                ДежурныеГруппыСмены.EditManager.Change();
            }
        }