Правильный способ установить выделенный текст поля со списком в winforms? - PullRequest
1 голос
/ 08 июля 2020

У меня есть форма, которая принимает объект в своем конструкторе и заполняет элементы управления в форме из свойств этого объекта. У меня проблема, из-за которой я не могу установить свойство ComboBox SelectedText или, по крайней мере, он не работает так, как я ожидал.

public Form(ValueHoldingObject obj)
{
    // yeah I know this is not a very clean way to populate the combobox, the issue
    // isn't limited to the combobox so I don't think this is relevant
    List<int> items = Repo.GetAllItems().Reverse();
    foreach (int id in checkInPrizeIds.Take(100))
        // Insert at beginning to put more recently used items at the top
        combobox.Items.Insert(0, id);
    combobox.DropDownHeight = 200;

    combobox.SelectedText = obj.StringProperty;
}

Когда я тестирую эту форму, текст поле со списком не заполняется. Если я добавлю точку останова в строке, где я назначаю текст, который он ДЕЙСТВИТЕЛЬНО назначается, то возникает какое-то событие (возможно, несколько событий смены фокуса) и заставляет его работать так, как я хочу. Очевидно, я не могу использовать точку останова в качестве исправления в производственном коде. Я неправильно назначаю это значение? Следует ли мне использовать другой метод для заполнения значений?

Дальнейшее тестирование показало, что это не просто поле со списком, все мои элементы управления заполняются правильно, только если у меня есть точка останова.

1 Ответ

1 голос
/ 08 июля 2020

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

foreach ( var item in combobox.Items )
if ( (string)item == obj.StringProperty )
  combobox.SelectedItem = item;

Или:

foreach ( var item in combobox.Items )
  if ( (int)item == Convert.ToInt32(obj.StringProperty) )
      combobox.SelectedItem = item;

Это сбивает с толку, но, несмотря на название, свойство SelectedText на самом деле не выбранный элемент ... потому что элементы поля со списком являются объектами, а не строками: показанные тексты представляют собой объекты элементов с использованием ToString().

Поэтому установка выделенного текста не гарантирует выбора элемент, и мы можем предпочесть установку SelectedItem.

В дополнение к этим соображениям вы устанавливаете свойство selected text в конструкторе после заполнения поля со списком, и это может вызвать проблемы, потому что оно находится перед формой и нарисованы элементы управления или что-то в этом роде ... то есть, возможно, до того, как методы ToString() будут вызваны для элементов для подготовки визуального кеша, поэтому установка выделенного текста не может привести к совпадению со списком.

Установка выделенного текста выделяет существующий элемент, если это сделано в загрузке формы или отображаемых событиях.

private void Form_Load(object sender, EventArgs e)
{
  combobox.SelectedText = obj.StringProperty;
}

ComboBox. edText не дает мне SelectedText

ComboBox.SelectedText Свойство

...