0

Я динамически формирую tableLayoutPanel, туда добавляю combobox. Данные беру из бд и записываю в виде словаря(мне так просто проще работать). Потом данные поставлю в combobox в виде источника данных, предварительно представив его в виде List. Далее пытаюсь задать свойство selectedValve, что бы по умолчанию было выбрано нужное мне значение. Но при отладке кода это свойство остаётся пустым и выбрано самое первое значение из словаря. Я уже давненько разбирался с подобной проблемой и успешно решил её, но тут я всё перепробовал и даже не знаю в чём может быть причина.

Вот отрывок данного фрагмента:

foreach (Dictionary<string, string> route in AllRoutes.Values)
        {
    TableLayoutPanel table = tableLayoutPanel8;     

    Dictionary&lt;int, string&gt; DictionaryBuses = new Dictionary&lt;int, string&gt;();

    foreach (Dictionary&lt;string, string&gt; bus in AllBuses.Values)
    {
        DictionaryBuses.Add(Convert.ToInt32(bus[&quot;id&quot;]), bus[&quot;mark&quot;]);
    }
    table.RowCount = table.RowCount + 1;
    table.RowStyles.Add(new RowStyle(SizeType.Absolute, 30F));
    table.Controls.Add(new ComboBox()
    {
        Name = &quot;RouteBus_&quot; + route[&quot;id&quot;],
        DropDownStyle = ComboBoxStyle.DropDownList,
        DisplayMember = &quot;Value&quot;,
        ValueMember = &quot;Key&quot;,
        //DataSource = new BindingSource(DictionaryBuses, null),
        DataSource = DictionaryBuses.ToList(),
        SelectedValue = Convert.ToInt32(route[&quot;id_bus&quot;]),
        Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)))
    }, 0, table.RowCount - 1);

Пробовал и менять и после создания ComboBox, пробовал вручную задавать значение. Вообщем я без понятия в чём может быть причина.

Вот фото что я получаю при компиляции: введите сюда описание изображения

в выводе консоли последние 3 строчки в кавычках это я вывожу значение SelectedValve

R1k3
  • 1

1 Answers1

0

Решил проблему выполнением асинхронной функции, которая через некоторый промежуток перебирает все нужные мне ComboBox'ы и задаёт в них нужное мне значение. Конечно костыль, но это работает!

Ниже прилагаю моё решение:

await EditTextBox(table);

Код функции EditTextBox:

private async Task EditTextBox(TableLayoutPanel table)
{
    await Task.Yield();
    foreach (Dictionary<string, string> route in AllRoutes.Values)
    {
        ((ComboBox)table.Controls["RouteBus_" + route["id"]]).SelectedValue = Convert.ToInt32(route["id_bus"]);
    }
}
aepot
  • 49,560
R1k3
  • 1
  • Этот код нерабочий, вы обращаетесь к UI из стороннего потока, что само по себе недопустимо и в некоторых случаях приводит к потере данных или падению приложения. Чтобы улучшить ситуациию, нужно выбросить Task.Run, сделать async Task EditTextBox(...), и вызвать вот так await EditTextBox(table); – aepot Jan 29 '23 at 10:12
  • @aepot Спасибо за совет! – R1k3 Jan 29 '23 at 12:17
  • если удалось применить совет, обновите код в ответе. Кстати, здесь не в ожидании дело, а в последовательности выполнения кода. Если я прав, то (после убирания Task.Run) await Task.Delay(10) можно заменить на await Task.Yield(), и все так же продолжит работать. – aepot Jan 29 '23 at 12:34
  • 1
    @aepot Если я не ошибаюсь, по уму правильнее реализовать вывод через компонент DataGridView либо создавать пользовательский компонент. Но в DataGridView мне не нравиться вывод данных, хоть и практично и просто, а писать пользовательские компоненты у меня пока что не хватает навыков. Ещё раз спасибо за помощь! – R1k3 Jan 29 '23 at 14:23
  • Посмотрите в сторону привязок данных https://ru.stackoverflow.com/a/1199692/373567 многое станет проще делать, технология не сложная. Ещё ссылка https://ru.stackoverflow.com/a/1450968/373567, и ещё https://ru.stackoverflow.com/a/1407823/373567 – aepot Jan 29 '23 at 14:45
  • А так, Winforms это не про красивый и гибкий интерфейс. То, с чем вы здесь мучаетесь, легко за 10 минут делается в WPF без каких-либо костылей. Кстати, на базе тех же самых привязок, там без привязок вообще ничего не делается, по уму. – aepot Jan 29 '23 at 14:53