powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Заполнение DataGridView столбиками
9 сообщений из 9, страница 1 из 1
Заполнение DataGridView столбиками
    #36444780
Фотография Alexandr Alexandrovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем ещё раз привет!

Помогите, плиз, с такой вот задачей. Есть DataGridView, я заполняю его столбиками вручную. Примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
foreach (DataColumn dataColumn in dataTable.Columns)
{
    DataGridViewTextBoxColumn dataGridViewTextBoxColumn = new DataGridViewTextBoxColumn();
    dataGridViewTextBoxColumn.Name = dataColumn.ColumnName;
    dataGridViewTextBoxColumn.DataPropertyName = dataColumn.ColumnName;
    tSDataGridViewTextBoxColumn.ValueType = dataColumn.DataType;

    dataGridView.Columns.Add(tSDataGridViewTextBoxColumn);
}

Т.е. обычный столбик имеет тип DataGridViewTextBoxColumn
Но в некоторых столбиках значения можно выбирать из списка, который будет подтягиваться из другой таблицы-справочника. Т.е. такие столбики должны иметь тип DataGridViewComboBoxColumn.

Если значение столбика подтягивается из др таблицы, то его свойство Expression непустое. Но вот как получить эту самую таблицу-справочник, чтобы её значениями заполнить список допустимых значений?

Буду очень-очень благодарен за любую помощь!!!
...
Рейтинг: 0 / 0
Заполнение DataGridView столбиками
    #36444840
Фотография Alexandr Alexandrovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. мне в коде нужно сделать проверку наподобие такой:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
if (string.IsNullOrEmpty(dataColumn.Expression))
{
    //Если Expression пустое, то єто обічній текстовій столбик
    DataGridViewTextBoxColumn dataGridViewTextBoxColumn = new DataGridViewTextBoxColumn();
}
else
{
    //Иначе, это столбик-комбобокс
    DataGridViewComboBoxColumn dataGridViewComboBoxColumn = new DataGridViewComboBoxColumn();
    //Как-то из dataColumn.Expression вытащить родительскую таблицу-справочник
    dataGridViewComboBoxColumn.DataSource = //!!!и указать её здесь!!!
}

//А здесь указать общие для обоих типов свойства
dataGridViewTextBoxColumn.Name = dataColumn.ColumnName;
dataGridViewTextBoxColumn.DataPropertyName = dataColumn.ColumnName;
tSDataGridViewTextBoxColumn.ValueType = dataColumn.DataType;
dataGridView.Columns.Add(tSDataGridViewTextBoxColumn);
...

Или может быть я что-то неправильно понимаю... ((
...
Рейтинг: 0 / 0
Заполнение DataGridView столбиками
    #36445548
Фотография WYPMAH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexandr Alexandrovich
Код: plaintext
1.
    //Как-то из dataColumn.Expression вытащить родительскую таблицу-справочник
    dataGridViewComboBoxColumn.DataSource = //!!!и указать её здесь!!!

ну так сделайте новый датаСорс настроенный на этот справочник и привяжите его к своему комбоБоксу...

_______________
AnimeBay - аниме магазин, который Вас не разочарует.
...
Рейтинг: 0 / 0
Заполнение DataGridView столбиками
    #36445667
Фотография Alexandr Alexandrovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну... Так можно было бы сделать, например, если бы в моей таблице только одно поле ссылалось на значение из отдельной справочной таблицы. Но таких полей несколько. И для каждого поля датаСорсом будет своя таблица, имя которой желательно не писать в коде.

А сам код, создающий столбики, находится в цикле foreach с переменной диапазона dataColumn.

Если захардкодить датаСорсы, но тогда это придётся делать для всех таблиц, а их очень много!

Получается, что проблема в том, как узнать, имея только один объект dataColumn, на какую таблицу и на какое поле в ней он ссылается?
...
Рейтинг: 0 / 0
Заполнение DataGridView столбиками
    #36446117
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexandr Alexandrovich
Получается, что проблема в том, как узнать, имея только один объект dataColumn, на какую таблицу и на какое поле в ней он ссылается?
DataColumn.Table и DataColumn.ColumnName :)
Но при чём здесь ComboBox? Как Вы его будете заполнять данными из таблицы-справочника когда он будет размещаться отдельно на форме а не в гриде к примеру?
...
Рейтинг: 0 / 0
Заполнение DataGridView столбиками
    #36446226
Фотография WYPMAH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexandr AlexandrovichНу... Так можно было бы сделать, например, если бы в моей таблице только одно поле ссылалось на значение из отдельной справочной таблицы. Но таких полей несколько. И для каждого поля датаСорсом будет своя таблица, имя которой желательно не писать в коде.

А сам код, создающий столбики, находится в цикле foreach с переменной диапазона dataColumn.

Если захардкодить датаСорсы, но тогда это придётся делать для всех таблиц, а их очень много!

Получается, что проблема в том, как узнать, имея только один объект dataColumn, на какую таблицу и на какое поле в ней он ссылается?
мало что понял из вашего поста, но хочу сказать, что датаСорсы можно и динамически создавать ;)

_______________
AnimeBay - аниме магазин, который Вас не разочарует.
...
Рейтинг: 0 / 0
Заполнение DataGridView столбиками
    #36447509
Фотография Alexandr Alexandrovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WYPMAH,

Да, у меня только динамическое создание. Как я сейчас вижу, я не чётко описал суть проблемы.
Кто ясно мыслит, тот ясно излагает, а ясности мне пока не очень хватает...
В следующем посте постараюсь нормально написать, что я хочу сделать :)
...
Рейтинг: 0 / 0
Заполнение DataGridView столбиками
    #36447785
Фотография Alexandr Alexandrovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANADataColumn.Table и DataColumn.ColumnName :)
Но при чём здесь ComboBox? Как Вы его будете заполнять данными из таблицы-справочника когда он будет размещаться отдельно на форме а не в гриде к примеру?DataColumn.Table и DataColumn.ColumnName - вот ответ на мой вопрос ))))
Прошу прощения, что так запутанно выражаю мысли... на самом деле я хочу вот чего:

Мой интерфейс допускает 2 формы отображения данных :
1. Просмотр записей таблицы по одной за раз. Для этого для каждой таблицы нужно создать отдельный класс формы. Значения полей выводятся контролами TextBox, ComboBox, CheckBox и т.д., каждый из которых я привязваю к данным вручную.
2. Просмотр нескольких записей таблицы. Для этого нужна форма с гридом. Грид заполняется столбиками при помощи программного кода. Эта форма со гридом - общая для всех таблиц . Поэтому программный код, который строит столбики, должен быть универсальным (по крайней мере для существующих таблиц).

Конечно, полностью универсальный код сделать не получится. Поэтому есть такие ограничения:
Возможные типы данных: String, Int32, Double, Decimal, DateTime, TimeSpan
В DataSet-е используются Relation-ы.

Например, у меня есть Такая структура данных:
Код: plaintext
Таблица Task 
:
Id - первичный ключ
Number
CustomerId - вторичный ключ, ссылается на таблицу Customer, поле Id
CustomerName - вычисляемое, тянется из таблицы Customer, поля "Name"
OrderId - вторичный ключ, ссылается на таблицу Order, поле Id
OrderNumber - вычисляемое, тянется из таблицы Order, поля "Number"
Content

Два Relation-а, касающиеся таблицы Task:
"TaskCustomerId" - родительский столбик "Customer.Id", дочерний "Task.CustomerId"
"TaskOrderId" - родительский столбик "Order.Id", дочерний "Task.OrderId"

Таблица Customer :
Id - первичный ключ
Name

Таблица Order :
Id - первичный ключ
Number
Description
Код, который строит столбики - это цикл foreach:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
foreach (DataColumn dataColumn in dataTable.Columns)
{
    //Здесь пока что не предусмотрено, что столбики могут быть разных типов,
    //предполагается только DataGridViewTextBoxColumn
    DataGridViewTextBoxColumn dataGridViewTextBoxColumn = new DataGridViewTextBoxColumn();
    dataGridViewTextBoxColumn.Name = dataColumn.ColumnName;
    dataGridViewTextBoxColumn.DataPropertyName = dataColumn.ColumnName;
    dataGridViewTextBoxColumn.ValueType = dataColumn.DataType;

    dataGridView.Columns.Add(tSDataGridViewTextBoxColumn);
}

В теле цикла используем переменную dataColumn.
Например, цикл остановился на поле "CustomerId".
Тогда DataColumn содержит поле "CustomerId".
Из DataColumn как-то нужно узнать, является ли "CustomerId" вторичным ключом. В данном случае ДА.
Тогда из DataColumn нужно достать таблицу, на которую ссылается "CustomerId". Это таблица "Customer".
Зная эту информацию, создаём столбик dataGridViewComboBoxColumn типа DataGridViewComboBoxColumn. В его свойство DataSource пишем таблицу "Customer".
dataGridViewColumn.ValueMember = "CustomerId";
dataGridViewColumn.DisplayMember = "CustomerName";


Я не знаю, как сделать то, что я выделил цветом... Если у Вас есть идеи, как это сделать, подсажите, плиз!
...
Рейтинг: 0 / 0
Заполнение DataGridView столбиками
    #36453200
Фотография Alexandr Alexandrovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу этой проблемы могу сделать заключение - универсального кода написать не удалось, но всё, что хотел, я сделал.

Скорее всего DataColumn, ссылающийся на поле-вторичный ключ, не содержит информации о том, на какую родительскую таблицу и на какое поле в ней ссылается это поле (вторичный ключ). Но источник данных у меня теперь - BindingSource, а он даже такого понятия, как DataTable не содержит.
Поначалу вообще не понимал, как с BindingSource я буду строить столбики, у него ведь нету коллекции DataColumn. Но если взять из датаСета нужную таблицу, по её коллекции объектов DataColumn постоить столбики в DataGridView, то этот грид отлично заполняется данными из BindingSource. Получается, что BindingSource-у нужно от DataGridView всего лишь текстовые названия полей - куда что ложить.

Не судите строго за абстактные выражения в моих постах. Понимание предметной области появляется, но медленно...

Особенная благодарность skyANA за ссылки!
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Заполнение DataGridView столбиками
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]