Дополнительные атрибуты

Материал из ODANT Wiki
Перейти к: навигация, поиск

Для добавления полю дополнительных атрибутов в проекте нужного класса создается класс наследуемый от oda.Field

public class MyField : Field
{
  //Конструктор
  public MyField(oda.Field sender)
      : base(sender)
    {
   }
}

После конструктора описываются необходимые свойства. В атрибутах свойства указываются Имя и Категория, к которой будет принадлежать новое свойство поля. Тип возвращаемого значения будет типом атрибута поля. В следующем примере указан логический тип, поэтому атрибут поля будет содержать значения «true» и «false».

 [DisplayName("Имя")]
 [Category("Категория")]
 public bool MyAttribute
 {
  set
  {
   SetAttrValue("MyAttribute ", value);
  }
  get
  {
   return GetBoolAttrValue("MyAttribute");
  }
 }

SetAttrValue - записывает значение value атрибута в xml класса в атрибут, указанный первым параметром “MyAttribute”. GetBoolAttrValue, а также GetAttrValue, GetNumValue, GetEnumValue (и т.п.) извлекает значение атрибута из xml класса.

После этого в классе Init надо переопределить стандартное поле в свой тип.

 public override Field OverrideField()
 {
  return new MyField(Field);
 }

Можно также переопределить имеющиеся стандартные атрибуты и методы в классе поля

 public override void Reset()
 {
  base.Reset();
  _link_xquery = null;
 }

Для создания своего свойства в виде выпадающего списка используются классы, наследуемые от класса UITypeEditor. Свойству необходимо добавить атрибут Editor, а для SelectField -соответствующую директиву (либо указать в атрибуте oda.AttributeEditors.SelectField):

[Editor(typeof(SelectField), typeof(System.Drawing.Design.UITypeEditor))]

По умолчанию TypeEditor позволяет получить дерево полей и заполнить ими выпадающий список. Если же он должен содержать другие значения – понадобится редактирование TypeEditor. Для этого в проект добавляется следующий класс и в его код вносятся необходимые изменения:

public class SelectField : UITypeEditor
{
 public override bool IsDropDownResizable { get { return true; } }
 IWindowsFormsEditorService edSvc;
 ClassFieldTree Tree;
 string Result;
 Class cls = null;
 public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
 {
  edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
  if (edSvc != null)
  {
   if (value != nul && value is string)
    Result = (string)value;
   Field fld = null;
   if (context.Instance is Field)
    fld = context.Instance as Field;
   else if (context.Instance is FieldPart)
    fld = (context.Instance as FieldPart).Field;
   if (fld != null)
    cls = fld.Class;
   else if (context.Instance is Class)
    cls = context.Instance as Class;
   else if (context.Instance is ClassPart)
    cls = (context.Instance as ClassPart).Class;
   if (cls == null)
    return Result;
   Tree = new ClassFieldTree(cls, true);
   Tree.SelMode = true;
   Tree.ContextItem = fld;
   Tree.treeList1.DoubleClick += new EventHandler(treeList1_DoubleClick);
   edSvc.DropDownControl(Tree);
   return Result;
  }
  return value;
 }
 void treeList1_DoubleClick(object sender, EventArgs e)
 {
  if (Tree.SelectedItem != null)
   Result = Tree.SelectedFullPath;
  edSvc.CloseDropDown();
 }


 void lb_Click(object sender, EventArgs e)
 {
  Result = null;
  edSvc.CloseDropDown();
 }
 public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
 {
  return UITypeEditorEditStyle.DropDown;
 }
}

Ссылки: