oscript-simple-gui
oscript-simple-gui copied to clipboard
Особенности поведения в Linux(Ubuntu)
При выполнении примера example-all-components.os из поставки релиза библиотеки версии 1.1.2.3 замечены следующие особенности:
- Падение скрипта на строках
ПолеСоСписком = Данные;
иПолеСписка = Данные2
. После комментирования этих строк окно открывается. - В открывшемся окне все заголовки полей обрезаны примерно до 7 символов.
Для устранения ошибки 1 я заменил код сеттера свойства СписокВыбора на следующий: `set { ArrayList KeysAndValues = new ArrayList(); foreach (ScriptEngine.HostedScript.Library.KeyAndValueImpl _keyAndValue in value) { IValue _key = _keyAndValue.Key; IValue _value = _keyAndValue.Value; KeysAndValues.Add(new ScriptEngine.HostedScript.Library.KeyAndValueImpl(_key, _value)); }
if (this._formFieldType == (int)EnumFormFieldType.ListBox)
{
this._choiceList = value;
((ListBox)this._item).DataSource = KeysAndValues;
((ListBox)this._item).DisplayMember = "Key";
((ListBox)this._item).ValueMember = "Value";
}
else
{
this._choiceList = value;
((ComboBox)this._item).DataSource = KeysAndValues;
((ComboBox)this._item).DisplayMember = "Key";
((ComboBox)this._item).ValueMember = "Value";
}`
Кстати, насколько я понимаю логику работы объекта КлючИЗначение, Ключ это строка, а значение может быть и числом и датой и объектом. Поэтому отображать надо ключ, а в Значение при выборе помещать Значение. В текущей версии библиотеки наоборот.
Эффект из пункта 2 устранился (в результате экспериментов и плясок с бубном) после комментирования строки в конструкторе
_label = new Label(); _panelTitleContainer.Controls.Add(_label); _label.AutoSize = true; // следующая строка мешает //_label.Dock = DockStyle.Fill;
1.1
/// <summary>
/// Установка / получение списка выбора для ПолеСоСписком, ПолеСписка
/// </summary>
/// <value>Соответствие</value>
[ContextProperty("СписокВыбора", "ChoiceList")]
public ScriptEngine.HostedScript.Library.MapImpl ChoiceList
{
get { return this._choiceList; }
set
{
BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = ChoiceList;
if (this._formFieldType == (int)EnumFormFieldType.ListBox)
{
this._choiceList = value;
((ListBox)this._item).BeginUpdate();
((ListBox)this._item).DataSource = new BindingSource(ChoiceList, null);
((ListBox)this._item).DisplayMember = "Value";
((ListBox)this._item).ValueMember = "Key";
((ListBox)this._item).EndUpdate();
}
else
{
this._choiceList = value;
((ComboBox)this._item).BeginUpdate();
((ComboBox)this._item).DataSource = new BindingSource(ChoiceList, null);
((ComboBox)this._item).DisplayMember = "Value";
((ComboBox)this._item).ValueMember = "Key";
((ComboBox)this._item).EndUpdate();
}
}
}
DisplayMember - Получает или задает свойство отображения для объекта ListControl.(Inherited from ListControl)
ValueMember - Получает или задает путь к свойству, которое должно использоваться как фактическое значение для компонентов в элементе управления ListControl.(Inherited from ListControl)
Мы подаем: ScriptEngine.HostedScript.Library.MapImpl - Соответствие. У соответствия есть
- Ключ - Ключ устанавливаемого элемента. Уникальное
- Значение - Значение устанавливаемого элемента
Поэтому и идет связка: ValueMember = Ключ DisplayMember = Значение
1.2 В реализации .net под Windows это не вызывает ошибку.
Можно попробовать убрать _label.AutoSize = true;
оставив _label.Dock = DockStyle.Fill
Надо проверять, пока не моделировал.
Кстати, а почему вообще для СпискаВыбора используется Соответствие, а не список значений как в 1с?
Исторически сложилось.
:) Понятно. Хотя и неправильно. Я еще в #68 комментарий добавил.