DevExpress LookupEdit - установка выбранной DataRow по коду - PullRequest
3 голосов
/ 22 сентября 2011

Я знаю, что есть и другие подобные вопросы, но их решения у меня не работают.

У меня есть следующий код:

     lueSizes.Properties.DataSource = new BindingSource(PS.PaperSizes, null);
     lueSizes.Properties.Columns.Add(new LookUpColumnInfo("PaperName", "Größe"));
     lueSizes.Properties.DisplayMember = "PaperName";
     lueSizes.Properties.ValueMember = "PaperName";

     //PS is a regular System PrinterSettings object
     foreach (PaperSize size in PS.PaperSizes)

         //I confirmed with debugging that this actually happens correctly
         if (size.RawKind == binSettings.SizeRawKind)
          {
              lueSizes.EditValue = size;
              break;
          }

Заполнение LookupEdit источником данных работает нормально, пользователь может выбрать нужный PaperSize из выпадающего списка, и

lueSizes.GetSelectedDataRow () как PaperSize

затем возвращает объект PaperSize, как и ожидалось.

У меня проблема с установкой EditValue, он просто ничего не делает. Я убедился, что во время выполнения DataSource содержит все объекты PaperSize в PS.PaperSizes, включая тот, который находится в цикле foreach. Но установка EditValue = size не приводит к соответствующему обновлению выбранной строки данных.

Другие варианты, которые я пробовал:

lueSizes.EditValue = size.PaperName;

lueSizes.EditValue = lueSizes.Properties.GetKeyValueByDisplayText (size.PaperName);

lueSizes.EditValue = lueSizes.Properties.GetKeyValueByDisplayValue (size.PaperName);

lueSizes.EditValue = lueSizes.Properties.GetKeyValueByDisplayValue (size);

lueSizes.EditValue = 0;

Ничего из этого не делает, выбранный datarow остается NULL и ничего не отображает для пользователя.

Что еще можно попробовать установить выбранный DataRow по коду?

Edit:

    private void lueSizes_EditValueChanged(object sender, EventArgs e)
    {
        object o = lueSizes.EditValue;
        object p = lueSizes.GetSelectedDataRow();
        PaperSize size = o as PaperSize;
        UpdateSize(size);
    }

Объект o - это элемент, который я установил ранее, размер PaperSize, который я нашел в цикле, но объект p равен нулю.

Ответы [ 3 ]

1 голос
/ 22 сентября 2011

Я думаю, что, по крайней мере, нашел обходной путь:


BindingSource bindingSource = new BindingSource(PS.PaperSizes, null);
lueSizes.Properties.DataSource = bindingSource;
lueSizes.Properties.Columns.Add(new LookUpColumnInfo("PaperName", "Größe"));
lueSizes.Properties.DisplayMember = "PaperName";

foreach (PaperSize size in bindingSource)
    if (size.RawKind == BinSettings.SizeRawKind)
    {
        lueSizes.EditValue = size;
        break;
    }

private void lueSizes_EditValueChanged(object sender, EventArgs e)
{
    PaperSize size = lueSizes.EditValue as PaperSize;
    Update(size);
}

Итак, сначала я разрешил поиск в цикле в BindingSource, который я долженопределите прямо сейчас вместо объекта Printersettings.

Далее я не могу установить свойство DisplayValue.

Наконец, я стараюсь не искать DataRow и напрямую переходить к значению редактирования.Не знаю, какие ограничения

Я не знаю, что еще сломается, если что, но сейчас это работает.

0 голосов
/ 05 августа 2015

Я знаю, что это старая тема, но у меня такая же проблема.Принятый ответ - не лучшая практика, поскольку наша цель - получить выбранный объект, а не значение ключа.Обходной путь должен вызвать lookupEdit.Properties.ForceInitialize () сразу после того, как EditValueChangedEvent был запущен, а GetSelectedDataRow () должен работать позже.Это решит проблему, если lookupEdit не изменяется с помощью мыши.

0 голосов
/ 22 сентября 2011

Вы должны убедиться, что назначенное значение существует в источнике данных lookupEdit,
, а затем попытаться установить свойство .Text напрямую

Чтобы получить базовый назначенный объект

PaperSize  selectedPS = (PaperSize)lueSizes.Properties.GetDataSourceRowByDisplayValue(lueSizes.Text)
...