Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# и базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Friedrich
3 / 3 / 1
Регистрация: 01.07.2015
Сообщений: 12
#1

Ошибка при заполнении Combobox в dataGridView "Недопустимое значение" - C#

04.02.2016, 01:18. Просмотров 830. Ответов 1
Метки нет (Все метки)

Доброго времени суток!
Прошу помочь со следующей проблемой:
Вручную создал dataGridView. Связал с базой Access. Часть колонок - это TextBox'ы, а часть — Combobox'ы (используется для того, чтобы отображались значения ячеек, а не id ).
При заполнении Combobox'ов возникает ошибка "System.ArgumentException: Недопустимое значение DataGridViewComboboxCell"
Не могу понять причину.
Посмотрел много форумов, а также официальную документацию Microsoft, однако везде написано либо, как у меня, либо (как в Microsoft) приводится пример, где ты заранее вводишь значения для выбора в Combobox'e. Мне же надо вообще замаскировать его под обычную ячейку, чтобы просто отображалось нужное значение из БД без возможности выбора.
Код прилагаю:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//метод заполнения данными из БД
 
 
        public void DataFilling() 
        {
 
            OleDbCommand command = new OleDbCommand();
            command.Connection = conn;
            ds = new DataSet();
            da = new OleDbDataAdapter(command);
            builder = new OleDbCommandBuilder(da);
            OleDbCommand com = new OleDbCommand("SELECT * FROM Storage", conn);
            da.SelectCommand = com;
            da.UpdateCommand = builder.GetUpdateCommand();
            da.Fill(ds);
 
            da.UpdateCommand = builder.GetUpdateCommand();
            da.InsertCommand = builder.GetInsertCommand();
            da.DeleteCommand = builder.GetDeleteCommand();
            
            dataGridView1.AutoGenerateColumns = false;
 
            //Первая колонка///////////////////////////////////////////////////
            DataGridViewTextBoxColumn idTextColumn = new DataGridViewTextBoxColumn();
            idTextColumn.HeaderText = "ID";
            idTextColumn.Resizable = DataGridViewTriState.True;
            idTextColumn.Width = 65;
            idTextColumn.DataPropertyName = "TitleID";
            idTextColumn.Name = "TitleID";
            idTextColumn.ReadOnly = true;
 
            //Вторая колонка///////////////////////////////////////////////////
            DataGridViewTextBoxColumn titleTextColumn = new DataGridViewTextBoxColumn();
            titleTextColumn.HeaderText = "Название товара";
            titleTextColumn.Resizable = DataGridViewTriState.True;
            titleTextColumn.Width = 65;
            titleTextColumn.DataPropertyName = "ItemTitle";
            titleTextColumn.Name = "ItemTitle";
            idTextColumn.ReadOnly = true;
 
            //Третья колонка///////////////////////////////////////////////////
            DataGridViewTextBoxColumn qtyTextColumn = new DataGridViewTextBoxColumn();
            qtyTextColumn.HeaderText = "Кол-во";
            qtyTextColumn.Resizable = DataGridViewTriState.True;
            qtyTextColumn.Width = 65;
            qtyTextColumn.DataPropertyName = "Qty";
            qtyTextColumn.Name = "Qty";
            idTextColumn.ReadOnly = true;
 
            //Четвертая колонка//////////////////////////////////////////////////
            DataGridViewComboBoxColumn unitCmb = new DataGridViewComboBoxColumn();
            unitCmb.HeaderText = "Ед измерения";
            unitCmb.ValueMember = "UnitID";
            unitCmb.DisplayMember = "UnitTitle";
            unitCmb.Resizable = DataGridViewTriState.True;
            unitCmb.Width = 65;
            unitCmb.DataPropertyName = "Unit";
            unitCmb.Name = "Unit";
            idTextColumn.ReadOnly = true;
 
            //Пятая колонка//////////////////////////////////////////////////////
            DataGridViewTextBoxColumn cpriceTextColumn = new DataGridViewTextBoxColumn();
            cpriceTextColumn.HeaderText = "Закупочная цена";
            cpriceTextColumn.Resizable = DataGridViewTriState.True;
            cpriceTextColumn.Width = 65;
            cpriceTextColumn.DataPropertyName = "CostPrice";
            cpriceTextColumn.Name = "CostPrice";
            idTextColumn.ReadOnly = true;
 
            //Шестая колонка//////////////////////////////////////////////////
            DataGridViewComboBoxColumn currencyCmb = new DataGridViewComboBoxColumn();
            currencyCmb.HeaderText = "Валюта";
            currencyCmb.DisplayMember = "CurrencyTitle";
            currencyCmb.Resizable = DataGridViewTriState.True;
            currencyCmb.Width = 65;
            currencyCmb.DataPropertyName = "Currency";
            currencyCmb.Name = "Currency";
            idTextColumn.ReadOnly = true;
 
            //Седьмая колонка//////////////////////////////////////////////////
            DataGridViewComboBoxColumn companyCmb = new DataGridViewComboBoxColumn();
            companyCmb.HeaderText = "Контрагенты";
            companyCmb.DisplayMember = "CompanyTitle";
            companyCmb.Resizable = DataGridViewTriState.True;
            companyCmb.Width = 65;
            companyCmb.DataPropertyName = "CompanyID";
            companyCmb.Name = "CompanyID";
            idTextColumn.ReadOnly = true;
 
            //Восьмая колонка//////////////////////////////////////////////////
            DataGridViewTextBoxColumn deldateTextColumn = new DataGridViewTextBoxColumn();
            deldateTextColumn.HeaderText = "Дата поставки";
            deldateTextColumn.Resizable = DataGridViewTriState.True;
            deldateTextColumn.Width = 65;
            deldateTextColumn.DataPropertyName = "DeliveryDate";
            deldateTextColumn.Name = "DeliveryDate";
            idTextColumn.ReadOnly = true;
 
            //Девятая колонка//////////////////////////////////////////////////////
            DataColumn datacol = new DataColumn();
            datacol.ColumnName  = "PriceExpression";
            datacol.DataType = System.Type.GetType("System.Decimal"); 
            datacol.Expression = "CostPrice * 1.4";
            datacol.DefaultValue = 0;
            datacol.ReadOnly = true;
            
            DataGridViewColumn priceTextColumn = new DataGridViewColumn();
            priceTextColumn.DataPropertyName = "PriceExpression";
            priceTextColumn.HeaderText = "Стоимость";
 
            //Добавление в таблицу/////////////////////////////////////////
 
            this.dataGridView1.Columns.Add(idTextColumn);
            this.dataGridView1.Columns.Add(titleTextColumn);
            this.dataGridView1.Columns.Add(qtyTextColumn);
            this.dataGridView1.Columns.Add(unitCmb);
            this.dataGridView1.Columns.Add(cpriceTextColumn);
            this.dataGridView1.Columns.Add(priceTextColumn);
            this.dataGridView1.Columns.Add(currencyCmb);
            this.dataGridView1.Columns.Add(companyCmb);
            this.dataGridView1.Columns.Add(deldateTextColumn);
 
            //
            this.dataGridView1.DataSource = ds.Tables[0];
Заранее спасибо за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2016, 01:18
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ошибка при заполнении Combobox в dataGridView "Недопустимое значение" (C#):

Ошибка "Столбец не принадлежит таблице" при заполнении второй раз
Проблема такая, первый раз гружу в DataGrid - все нормально. Гружу данные...

Недопустимое значение ключа "data source"
Сделал оконное приложение. Хотел запустить без вижал студио. Выдает ошибку с...

Подключение к Access 2007 и ошибка "Недопустимое имя файла"
Здравствуйте .. Впервые подключаюсь из C# в ACCESS 2007 и возникает ошибка: ...

Ошибка "Недопустимое определение отчета"
Здравствуйте! создаю отчет в VS2012 (Добавить новый элемент - Отчет)....

Исключение "Column contains NULL data" при заполнении полей на форме
Здравствуете. Пытаюсь извлечь данные из БД (Oracle), и разместить полученные...

1
Friedrich
3 / 3 / 1
Регистрация: 01.07.2015
Сообщений: 12
11.02.2016, 02:58  [ТС] #2
Проблему решил.
Корень ошибки так и не нашел, поэтому не стал заморачиваться с программным созданием datagridview и просто вывел нужную мне информацию через запрос:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void DataFilling()
        {
 
            OleDbCommand command = new OleDbCommand();
            command.Connection = conn;
            dt = new DataTable();
            ds = new DataSet();
            da = new OleDbDataAdapter("SELECT Storage.ItemID as ID, Storage.ItemTitle as Товар, Storage.Qty as КолВо, Units.UnitTitle as ЕдИзмерения, Storage.CostPrice as ЗакупочнаяЦена, 1.4*[CostPrice] as Стоимость, Valuta.CurrencyTitle as Валюта, Companies.CompanyTitle as Поставщик FROM Companies INNER JOIN (Units INNER JOIN (Valuta INNER JOIN Storage ON Valuta.CurrencyID = Storage.Currency) ON Units.UnitID = Storage.Unit) ON Companies.CompanyID = Storage.CompanyID;", conn);
 
            builder = new OleDbCommandBuilder(da);
 
            da.Fill(dt);
 
            dataGridView1.AutoGenerateColumns = true;
            this.dataGridView1.DataSource = dt;
        }


Собственно, выводит все круто. Как и надо было, но чтобы вместо id было значение, пришлось брать эти самые значения из нескольких таблиц, из-за чего перестал работать da.UpdateCommand = builder.GetUpdateCommand();
Вылетает ошибка, типа "Динамическое создание SQL для нескольких базовых таблиц не поддерживается."

Решил: ок, надо написать запрос на Update. Но появилась проблема. Возможно, я не прав, но судя по шаблону подобного запроса, ты должен написать: UPDATE название таблицы SET столбец1=новое значение, столбец2 = новое значение и тд WHERE условие.
А если я не меняю значения и у меня нет условия. Допустим я просто удалил одну строку в datagridview и хочу сохранить изменения. Как мне это сделать?
P.S: Не хочу реализовывать удаление через запрос, так как не хочу вносить изменения напрямую в БД, чтобы была возможность вернуть все на свои места в случае ошибочного удаления, редактирования и тд.
Помогите, пожалуйста!!!
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2016, 02:58
Привет! Вот еще темы с решениями:

Ошибка при обновлении данных "Значение не может быть неопределенным. Имя параметра: dataTable"
Задача такая. Открывыаешь окно, из БД берутся соответствующие данные. Вручную...

Ошибка при заполнении ComboBox: Привязка к новому члену значения невозможна
Привет всем. Возникает ошибка при заполнении комбобокса: Привязка к новому...

При обновлении базы выходит ошибка "conversion error from string "27,5""
Здравствуйте при обновлении базы выходит ошибка "conversion error from string...

DataGridView - ошибка "На столбец наложено ограничение по уникальности."
Друзья, имеется БД из трёх таблиц (картинка слева). Задача состоит в том,...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru