Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/29: Рейтинг темы: голосов - 29, средняя оценка - 4.79
 Аватар для Student543
3 / 3 / 4
Регистрация: 17.11.2008
Сообщений: 54

Как записать DataGridView в DataTable, чтобы имена брались из .Columns.HeaderText

24.02.2016, 13:26. Показов 6051. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, коллеги!
Написал программу, которая получает из БД данные и выводит их на экран в DGV. Затем по нажатию кнопки эти данные пишутся в Эксель (Interop.Excel).
Для передачи данных в Эксель, я передаю данные из DGV в DT, но в DataTable(DT) идут имена столбцов таблицы в БД, а не те, что отображаются на форме.
Это конечно же логично, но как записать в DT имена столбцов, которые отображаются в DGV?
Есть простое решение, присваивать нужные имена столбцов прямо при селекте (select pole1 as 'ЖЕЛАЕМОЕ ИМЯ'), но есть ли еще варианты? Ведь в качестве исходных данных может быть не селект, а процедура.

Делаю запрос к таблице с такими столбцами:
SQL
1
SELECT [FAM], [NAM] FROM MyTable

Так я объявляю столбцы DGV:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void Form1_Load(object sender, EventArgs e)
        {
            dataGridView1.AutoGenerateColumns = false;
 
            dataGridView1.ColumnCount = 10;
            dataGridView1.ReadOnly = true;
            dataGridView1.AllowUserToAddRows = false;
 
            dataGridView1.Columns[0].Name = "FAM";
            dataGridView1.Columns[0].HeaderText = "Фамилия";
            dataGridView1.Columns[0].DataPropertyName = "FAM";
 
            dataGridView1.Columns[1].Name = "NAM";
            dataGridView1.Columns[1].HeaderText = "Имя";
            dataGridView1.Columns[1].DataPropertyName = "NAM";
        }
Так я записываю данные в DataTable:
C#
1
2
3
4
5
6
7
private void button2_Click(object sender, EventArgs e)
        {
            DataTable MyTable = dataGridView1.DataSource as DataTable;
            DataSet Result = new DataSet();
            Result.Tables.Add(MyTable);
            ExportDataSetToExcel(Result); // Вызываю метод формирования экселя и передаю на вход DataSet
        }
В итоге я получаю эксель с моими данными, но в шапке которого столбцы называются: FAM, NAM вместо Фамилия, Имя.

Изменение значения в параметре dataGridView1.Columns[1].Name ничего не дает. В DT по прежнему попадает значение из Columns[1].DataPropertyName (судя по всему).

Спасибо заранее!

Добавлено через 1 час 17 минут
Написал вот такой костыль на кнопку (код которой выше):
C#
1
2
3
4
5
6
7
8
9
10
11
        private void button2_Click(object sender, EventArgs e)
        {
            DataTable MyTable = dataGridView1.DataSource as DataTable;
            for (int i=0; i < MyTable.Columns.Count; i++)
            {
                MyTable.Columns[i].ColumnName = dataGridView1.Columns[i].HeaderText;
            }
            DataSet Result = new DataSet();
            Result.Tables.Add(MyTable);
            ExportDataSetToExcel(Result);
        }
Это работает, но ломается DGV. Т.е. допустим в него записалось 2 строчки с данными. Когда я жму эту кнопку, то данные из DGV пропадают, остается пустая таблица с 2 строчками, значений в них нет.

Добавлено через 10 минут
Не пойму, по какой причине меняется DataSource, если я передал его в DataTable и работаю уже с ней?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.02.2016, 13:26
Ответы с готовыми решениями:

Заполнение DataTable по Columns
Имеется фаил с записями такого вида 1 строка name1 name2 ....... name500 2 строка фффф ыыыыы ....... ввввв как из него ...

Как работает Link Columns в DataGridView?
Добрый день, форумчане. В общем есть DataGridView с информацией и последний столбец (в моем случае &quot;Код заведующего&quot;) является...

Не виден текст DataGridView Row HeaderText
Здравствуйте. Подскажите почему не получается сделать нумерацию строк DataGridView. Столбцы без проблем нумеруются. Такой вариант не...

2
160 / 148 / 92
Регистрация: 30.03.2011
Сообщений: 569
24.02.2016, 22:02
Связки БД --- DGV делаются так:
1) если из БД берется много таблиц, то БД - DataSet - BindingSource - DGV
2) если из БД берется одна таблица, то а) БД (или листинг из БД) - DataTable - BindingSource - DGV или
б) БД - DataTable - DGV
В вашем случае DataSet, как я понял, не нужна. У Вас есть DataTable, которую Вы должны настроить (задать столбцы и пр.) и в которую Вы закачиваете данные из БД (закачиваете строки DataTable); есть DGV, у которой в DataSource нужно указать вашу DataTable и они свяжутся - в DGV отобразятся данные DataTable с названием столбцов DataTable.
В Excel грузите данные из DataTable, не из DGV.
1
 Аватар для Student543
3 / 3 / 4
Регистрация: 17.11.2008
Сообщений: 54
25.02.2016, 11:17  [ТС]
Спасибо!
Понял, но пока выкрутился так: в метод формирования Экселя передаю DGV, а уже там ставлю заголовки. Вот кусок метода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
 for (int i = 1; i < dg.Columns.Count; i++)
                {//Задаю шапку таблицы в первой строке файла
                    excelWorkSheet.Cells[1, i] = dg.Columns[i].HeaderText;
                }
 
                for (int j = 0; j < dg.RowCount; j++)
                {//для каждой строки данной таблицы...
                    for (int k = 0; k < dg.Columns.Count; k++)
                    {//для каждого столбца данной таблицы... Записываю данные в ячейку начиная со 2 строки, 1 столбца
                        excelWorkSheet.Cells[j + 2, k + 1] = dg.Rows[j].Cells[k].Value;
                    }
                }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.02.2016, 11:17
Помогаю со студенческими работами здесь

Определить Name колонки, зная Headertext в Datagridview
Есть конструкция: dataGridView1.Columns(0).Name = &quot;Recipe&quot; т.е. по индексу задается имя как сделать обратное? Узнать имя или индекс...

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

Как заполнить dataGridView из DataTable?
Добрый день. Есть на форме dataGridView с 6 полями, одно из которых невидимое. Есть таблица в БД, в которой хранится информация. ...

List<T> => DataTable => DataGridView: как правильно?
Добрый день! Хрестоматийный пример public class Person { public int Id { get; set; } public string Name...

Скрыть поле в DataGridView слева от всех Columns
Подскажите, пожалуйста, как сделать невидимой поле слева от ДГВ, которое автоматически отображается при загрузке данных из эксель в ДГВ ?...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru