Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
28 / 28 / 19
Регистрация: 12.10.2014
Сообщений: 98
1
.NET 4.x

Ошибка в ComboBox после добавления источника данных

20.10.2016, 17:23. Показов 3048. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть класс, который я использую в качестве источника данных, он имеет вид:
C#
1
2
3
4
5
6
7
8
9
10
11
12
public class DemoSource
    {
         public static List<Types> _types = new List<Types>
        {
           Тут добавляю пару элементов типа Types
        };
        public class Types
        {
            public string Name { get; set; }
            public int Id { get; set; }
        }
    }
Далее захожу в дизайнер и прописываю источник и отображаемые элементы вручную:
C#
1
2
3
 this.comboBox.DataSource = _types;
 this.comboBox.DisplayMember = "Name";
 this.comboBox.ValueMember = "Id";
Всё работает нормально, но как только я пытаюсь изменить размер комбобокса либо просто перезагружаю студию, мне выкидывает ошибку, которая не даёт собрать проект, пока я полностью не удалю комбобокс.
Скриншот ошибки
Миниатюры
Ошибка в ComboBox после добавления источника данных  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.10.2016, 17:23
Ответы с готовыми решениями:

Сохранить данные в ComboBox после добавления новых данных
Добрый день. Создана форма организаций. Список организаций в комбобоксе создан программно. ...

ComboBox и ValueMember: использование источника данных
В WinForms работает следующий метод public void FillLB() { SqlConnection...

Событие изменения источника данных у ComboBox
Имеется comboBox, к itemsSource биндится коллекция. Вопрос такой: есть ли событие у comboBox'a...

Пытаюсь добавить записи в базу данных.После добавления 5-7 записей вылетает ошибка.
Уважаемые коллеги. Проблема следующая. Пытаюсь добавить записи в базу данных.После добавления 5-7...

8
28 / 28 / 19
Регистрация: 12.10.2014
Сообщений: 98
20.10.2016, 18:51  [ТС] 2
Я помечал его как сериализуемый, это не помогает

Добавлено через 1 час 21 минуту
Подозреваю, что дело в кривосделанном классе DemoSource, но не смог найти нормального примера с привязкой, везде использую базу данных в качестве источника
0
8940 / 4852 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
20.10.2016, 19:54 3
afapasha, попробуй сделать список не статическим. Статические члены не сериализуются
1
28 / 28 / 19
Регистрация: 12.10.2014
Сообщений: 98
20.10.2016, 20:04  [ТС] 4
ViterAlex, не помогло
Не могу понять как это работает, если не трогать контрол ( не менять его размер), то он будет исправно работать до перезапуска студии.
0
Эксперт .NET
5871 / 4748 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
20.10.2016, 21:49 5
afapasha,
Важнее исправить ошибку или докопаться до причины ее возникновения?
Если важнее ее исправить, то добавьте эти строки не в дизайнерский файл, а в обработчик загрузки формы (Form_Load):
C#
1
2
3
this.comboBox.DataSource = DemoSource._types;
this.comboBox.DisplayMember = "Name";
this.comboBox.ValueMember = "Id";
1
28 / 28 / 19
Регистрация: 12.10.2014
Сообщений: 98
20.10.2016, 22:03  [ТС] 6
Даценд, Понять причину.
Кстати, если переделать класс DemoSource, заменив в нём вложенный класс и лист на массив KeyValuePair, то уже получаем вот такой эксепшен.
После сборки проекта, строки
C#
1
2
3
this.comboBox.DataSource = DemoSource._types;
this.comboBox.DisplayMember = "Name";
this.comboBox.ValueMember = "Id";
преобразуются в более сложный код
Может это как-то влияет...
Миниатюры
Ошибка в ComboBox после добавления источника данных   Ошибка в ComboBox после добавления источника данных  
0
28 / 28 / 19
Регистрация: 12.10.2014
Сообщений: 98
20.10.2016, 22:20  [ТС] 7
В общем причину не понял, но нашёл способ исправления ошибки в дизайнере.
DemoSource изменил, добавив в него Dictionary<string, int> _types
А в дизайнере прописал
C#
1
this.comboBox.DataSource = new BindingSource(_types, null);
Upd. Ошибку не выдаёт, но и работает некорректно, при выборе любого элемента из комбобокса, просто игнорирует его и ничего не возвращает из ValueMember.
0
Эксперт .NET
5871 / 4748 / 2940
Регистрация: 20.04.2015
Сообщений: 8,361
20.10.2016, 22:39 8
Лучший ответ Сообщение было отмечено afapasha как решение

Решение

afapasha,
поменял класс, сделав статический конструктор для инициализации листа:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static class DemoSource
{
 
    public static List<Types> _types;
    static DemoSource()
    {
        _types = new List<Types>();
        _types.Add(new Types(){Name="qqq", Id=1});
        _types.Add(new Types(){Name="wwww", Id=2});
        _types.Add(new Types(){Name="eee", Id=3});
        _types.Add(new Types(){Name="rrr", Id=4});
    }
 
    public class Types
    {
        public string Name { get; set; }
        public int Id { get; set; }
    }
}
Затем добавил на форму комбобокс, а в дизайнерский файл код:
C#
1
2
3
this.comboBox1.DataSource = DemoSource._types;
this.comboBox1.DisplayMember = "Name";
this.comboBox1.ValueMember = "Id";
После перестроения решения в дизайнерском файле оказалось следующее:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 
// comboBox1
// 
this.comboBox1.DisplayMember = "Name";
this.comboBox1.FormattingEnabled = true;
types1.Id = 1;
types1.Name = "qqq";
types2.Id = 2;
types2.Name = "wwww";
types3.Id = 3;
types3.Name = "eee";
types4.Id = 4;
types4.Name = "rrr";
this.comboBox1.Items.AddRange(new object[] {
types1,
types2,
types3,
types4});
this.comboBox1.Location = new System.Drawing.Point(123, 29);
this.comboBox1.Name = "comboBox1";
this.comboBox1.Size = new System.Drawing.Size(180, 21);
this.comboBox1.TabIndex = 1;
this.comboBox1.ValueMember = "Id";
И все заработало.

Добавлено через 5 минут
Цитата Сообщение от afapasha Посмотреть сообщение
при выборе любого элемента из комбобокса, просто игнорирует его и ничего не возвращает из ValueMember
Здесь, как оказалось, тоже самое.

Добавлено через 50 секунд
А зачем нужно все это делать в дизайнере?

Добавлено через 4 минуты
Кстати, значение можно теперь получать так:
C#
1
(comboBox1.SelectedItem as DemoSource.Types).Id
Но все равно непонятна цель манипуляций с дизайнерским файлом.
1
28 / 28 / 19
Регистрация: 12.10.2014
Сообщений: 98
20.10.2016, 23:55  [ТС] 9
Даценд Ну я подумал, что этому коду самое место в дизайнере.А потом стало очень интересно узнать правильную реализацию
0
20.10.2016, 23:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.10.2016, 23:55
Помогаю со студенческими работами здесь

Закрытие файла после добавления в comboBox
string der = System.IO.Directory.GetDirectories(@&quot;E:\Аккаунты\Passwords&quot;); //Массив содержащий все...

После добавления записи, при клике на нее выскакивает системная ошибка: отсутствие данных в поле "чертеж"
Доброго времени суток! имеется вот такой код procedure TForm1.DBGrid1CellClick(Column: TColumn);...

Ошибка при настройке источника данных: Не удалось загрузить схему данных
Есть программа для учета заявок. Есть база на access. В базе есть табличка клиент(Имя, фамилия,...

Обращение к полю после смены источника данных
Приветствую! Есть база данных, в которой собрана информация по поступающим в учебное заведение....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru