2014-01-31

Работа с элементами управления в разметках карточек DocsVision

DocsVision

В последнее время много приходится работать с системой документооборота DocsVision. Она написана на C# и позволяет разрабатывать решения на C# и VB.NET.
В основном, решения задач приходится искать в документации, в декомпилированных кодах сборок и что-то есть на форумах. По ходу реализации проекта приходилось решать много разных задач. Решил выложить кое-какие наработки, с чем приходилось разбираться. Авось, потом еще опять сгодятся.
Работа велась с версиями DocsVision 5.0-5.2, весь код был испытан под них. Возможно, в дальнейшем обновимся еще и, надеюсь, совместимость не сломается и не придется переписывать какие-то коды.


Элементы управления

Разметки карточек DocsVision выполнены с использованием UI-библиотеки DevExpress.
Получение элементов управления для дальнейшего использования можно осуществить как минимум двумя способами.
1) Получаем стандартными методами WinForms экземпляр класса Control (System.Windows.Forms.Controls).

// получаем Control
Control myControl = this.CardControl.Controls.Find("myProperty", true)[0];
// работаем с Control, например, задаем текст
myControl.Text = "This is new text value for my property";
// при необходимости, можем привести экземпляр Control к текущему виду для получения полного набора доступных свойств, методов и событий
// если класс элемента управления заранее не известен, то можно подсмотреть его вот так:
MessageBox(myControl.GetType().FullName);

2) Используем классы ICustomizableControl, IPropertyControl и ILayoutPropertyItem.

//...
ICustomizableControl icc = (ICustomizableControl)this.CardControl;
ILayoutPropertyItem hintItem = icc.FindPropertyItem("Hint"); 
hintItem.ControlValue = "Это мой хинт";
// у ICustomizableControl мало членов, у IPropertyControl немного больше
IPropertyControl pr = icc.FindPropertyItem("Контроль документа");
// добавляем слушателя события изменения значения
pr.ControlValueChanged += delegate(Object sender, EventArgs e)
{
 IPropertyControl pr = (sender as IPropertyControl);
 MessageBox.Show(pr.ControlValue.ToString());
};
// или так
pr.ControlValueChanged += new EventHandler(this.onradioControlDoc);
//...
// обработчик события может выглядеть следующим образом:
private void onradioControlDoc(object sender, EventArgs e)
{
 IPropertyControl pr = (sender as IPropertyControl);
 MessageBox.Show(pr.ControlValue.ToString());
}

Таким образом программируются элементы управления в карточках.