Змінюй хід війни! Допомагай ЗСУ!
  • Знижка на баннерну рекламу 30%! Банер на всіх сторінках сайту, в мобільній та десктопній версії за 14 тис. грн на місяць. Статистика сайту. Контакт: kharkovforum.com@gmail.com

C#. Обработка таблицы перед выводом из БД

  • Автор теми Автор теми AposTol
  • Дата створення Дата створення
Статус: Офлайн
Реєстрація: 14.09.2005
Повідом.: 950
C#. Обработка таблицы перед выводом из БД

Ситуация такая: есть база данных. Из неё получаем полностью таблицу, нужно вывести эту таблицу на экран с возможностью редактирования и последующего сохранения результатов.
Есть одна особенность: часть полей таблицы может должна хранить несколько вариантов значений.

Мне видится использование DataGridView со столбцами из ComboBox и т.п. Но, если выгружать данные при помощи DataSet, то всё, включая заголовки полей, будет так же, как это хранится в базе данных, а нужно всё это интерпретировать. Тоесть обрабатывать таблицу перед тем, как выводить на экран.

Я смог придумать только поочерёдное заполнение DataGridView из DataSet, обрабатывая данные в зависимости от того, какое это поле. Но этот подход кажется мне сильно громоздким и не правильным.

Может кто-нибудь знает как сделать это правильно?
 
Что ты в конкретном случае полагаешь под интерпретировать перед выводом? То есть поменять значения полей таблицы на другие?
 
нет. Вот есть поле WorkType в таблице, которое будет содержать одно из значений 0, 1, 2, 3, 4... При выводе этого всего добра в DataGridView нужно, чтобы в нём был столбец из ComboBox, в которых значения из WorkType послужили бы индексами и выбрались соответствующие поля в ComboBox.
 
Если я правильно понял задачу, то Вам нужно использовать обработчик события DataGridView.CellFormatting для того, чтобы привести данные к нужному виду перед выводом в ячейку DataGridView.
Достаточно подробно подход описан в MSDN (
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
)
Как-то так...
UPD.
А вот здесь описано как захостить какой-нибудь контрол в ячейке DataGrid. Мне кажется для решения вашей задачи что-то подобное подойдет
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
 
использовать обработчик события DataGridView.CellFormatting это интересно.. вот только смущает, что он срабатывает каждый раз, когда форма получает фокус. Сейчас попробую что-нибудь сделать таким образом.. Спасибо

Похоже что DataSet вообще не получится использовать и придётся делать всё вручную, потому что сделал один столбец типа DataGridViewComboBoxColumn и уже выдаёт ошибку, что неверное значение для DataGridViewComboBoxCell. А ведь CellFormatting происходит уже после того, как данные занесены, как перед прорисовкой ячейки. Вот, если бы перехватывать значение как раз перед записью..
 
Останнє редагування:
А значение какого типа подавалось на DataGridViewComboBoxCell?
 
Ну в оригинале, как я уже сказал, там просто цифры, стало быть Int32.
 
приветствую, удалось решить проблему? столкнулся с аналогичной
 
Получилось вот так:

1. После биндинга DataGridView с таблицей появляются автоматически сгенерированные столбцы.

2. В дизайнере выбираем ваш DataGridView, ищем в свойствах коллекцию Columns, щелкаем по редактору коллекции (кнопка "...").

3. В левом списке находим имя столбца, который должен стать ComboBox. Для него устанавливаем:

3.1. ColumnType = DataGridViewComboBoxColumn
3.2. DataSource = таблица, на которую ссылается ваш FK. То есть где сидят названия типов работ
3.3. DataPropertyName = имя столбца - FK, ссылающегося на 3.2. То есть столбец вашей отображаемой таблицы, в которой код вида работ.
3.4. DisplayMember - поле из таблицы 3.2., которое надо отобразить вместо ключа
3.5. ValueMember - PK, то есть ключ из таблицы 3.2.
 
спасибо за ответ, дело в том, что дизайнер мне не доступен, у меня на форме пустая DataGridView

сначала я заполняю датасет

string query = "SELECT * FROM components";
NpAdapter.SelectCommand = new NpgsqlCommand(query, conn);
NpAdapter.Fill(dset, "npdata");
DataTable dtsource = dset.Tables["npdata"];

а потом прикручиваю эту таблицу к DataGridView

grid_devices.DataSource = dtsource;

после чего у меня появляется таблица:

5356.webp


и столбец "категория" в ней текстовый, а мне нужно, чтобы в нем были не цифры, а названия категорий с возможностью их изменения через комбобокс. Таблица категорий которая хранится другом датасете и заполняется так:

query = "SELECT * FROM categories";
NpAdapter.SelectCommand = new NpgsqlCommand(query, conn);
NpAdapter.Fill(cat, "npdata");
DataTable category_table = cat.Tables["npdata"];

подскажите, как разрулить эту ситуацию, буду весьма признателен.

я пробовал вручную удалить текстовый столбец "категории" и добавить столбец с комбобоксами
это работает, но комбобоксы никак не ассоциированы и все показывают пустое значение, т.е. связи между колонками нет в таком случае
 
Ну, тогда работы немножко больше, но все реально.

Отключаете автогенерацию столбиков, биндите и добавляете все необходимое в коде:

Код:
	dataGridView1.AutoGenerateColumns = false;
	dataGridView1.DataSource = dtSource;
	var column = new DataGridViewComboBoxColumn();
	dataGridView1.Columns.Add(column);
	column.DataSource = pkDatasource;
	column.DataPropertyName = "..."; // FK
	column.DisplayMember = "Name"; // Категория
	column.ValueMember = "Id";

Более красиво и детально расписано здесь:

⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.


P.S. Или да, можно попробовать снести автосгенерированный столбец и заменить его добавлением в коде.
 
Останнє редагування:
да я вот не могу разобраться со связкой DataSource, DataPropertyName, DisplayMember и ValueMember

могли бы Вы на моем примере объяснить ))

у меня есть две таблицы типа DataTable
одна называется device_table и содержит 3 колонки
id, device_name, category_id
допустим, там данные
1, dev1, 1
2, dev2, 1
3, dev3, 2

и есть вторая таблица category_table с двумя колонками id, category_name
1, cat1
2, cat2

как мне получить в датагриде таблицу:
1, dev1, cat1
2, dev2, cat1
3, dev3, cat2

чтобы последний столбец был комбо-боксом с возможностью изменить название категории

если я удаляю столбец и добавляю новый (или буду биндить вручную)
я получаю две колонки из первой таблицы и колонку комбобоксов, в которых перечислены значения из второй таблицы, но по-умолачнию во всех комбо-боксах выбрана первая пустая строка, они не отражают данных 3-й колонки из 1-й таблицы...
 
Для этого столбика теоретически такой набор:

DataSource = category_table. То есть источник данных, откуда берутся вообще названия категорий.

DataPropertyName = category_id. То есть foreign key на вторую таблицу.

DisplayMember = category_name. Поле, откуда берутся названия категорий.

ValueMember = id (имеется ввиду id второй таблицы, идентификатор категории, он же parent key).

Это все теоретически, 2 часа ночи, знаете ли, не тестил :) Не поможет - придется создавать тестовый проектик.
 
Назад
Зверху Знизу