Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
 Аватар для Vulpes93
1 / 1 / 0
Регистрация: 22.04.2013
Сообщений: 16

Сохранить/Загрузить экземпляр DataGridView в файл/из файла

29.10.2015, 14:39. Показов 4551. Ответов 12

Студворк — интернет-сервис помощи студентам
Всем день добрый. Почитал документацию MSDN про сериализацию, но их примеры оказались для меня непонятными.
Помогите разобраться. Мне нужно сохранить состояние таблицы DataGridView в файл, чтобы была возможность восстановить данные в форме. Хочу рассмотреть способ без использования баз данных или записи в .txt и др. Наткнулся на сериализацию.
Вот у меня есть таблица с клиентами

C#
1
2
          
this.customerGrid = new System.Windows.Forms.DataGridView();
Я туда ввел какие-то данные.
далее реализую меню "Файл" (Открыть/Сохранить)
"Сохранить" - преобразует таблицу в поток байтов и записывает их в файл.
"Открыть" - открывает файл и десериализует байты и отображает в моей форме мою заполненную таблицу.

Простого и наглядного примера будет достаточно. Если я упускаю какие-либо нюансы, прошу, пожалуйста, сообщить мне о них.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.10.2015, 14:39
Ответы с готовыми решениями:

Загрузить и сохранить файл с сервера
Добрый день, есть ли возможно загрузить файл с сервера на пк посредствам js? Вроде бы если я верно понял можно через Fetch, но сложно...

Сохранить данные из ListBox в файл и загрузить обратно
Как правильно сохранить данные из listbox в формат.txt? Как загрузить данные из файла в listbox?

Сохранить пиксели в файл и потом загрузить обратно
Написана программа для рисования, мне нужно сохранить картинку в файл, затем по нажатию другой кнопки загрузить эту картинку. У меня всё...

12
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
29.10.2015, 15:59
Сохранить/Загрузить экземпляр DataGridView в файл/из файла
Ну как можно сохранить DGV, если это просто сеточка на экране?
DGV, как и все контролы - не сериализуемые объекты. Оно и понятно, поскольку их задача - отрисовка данных на экране, а не хранение данных. Сериализовать же нужно сами данные а не контролы.
Вам нужно создать модель данных, и ее сериализовать.
В общем, вам сюда Архитектура ПО в WinForms (FAQ & HowTo)
1
403 / 86 / 8
Регистрация: 16.02.2013
Сообщений: 356
29.10.2015, 16:07
Для сохранения данных лучше использовать другие способы.
0
 Аватар для Vulpes93
1 / 1 / 0
Регистрация: 22.04.2013
Сообщений: 16
29.10.2015, 16:23  [ТС]
Storm23, благодарю. Полезная статья.
Какие есть способы сохранить данные из таблицы в файл? Точнее, как правильнее всего это сделать?
Как правильно сохранить состояние программы, для возможности его восстановления?
0
2 / 2 / 0
Регистрация: 18.10.2013
Сообщений: 61
29.10.2015, 16:43
Для начала скажите, как Вы подсовываете данные гриду. DataTable? Напрямую?
0
 Аватар для Vulpes93
1 / 1 / 0
Регистрация: 22.04.2013
Сообщений: 16
30.10.2015, 13:15  [ТС]
В форме. Пользователь заполняет две таблицы, и на основе данных из этих таблиц алгоритм заполняет третью таблицу. Третья таблица это просто решение задачи, ее я экспортирую в Excel. А первые две нужно будет сохранять, чтобы была возможность редактировать данные.

Добавлено через 4 часа 25 минут
В общем, потратив кучу времени на поиск информации в интернете, я пришел к новому решению.
Так как у меня две разные таблицы, я создам DataSet из двух таблиц, которые будут являться источниками для двух DataGridView. Ввод данных будет производиться построчно и записываться в DataTable, которые находятся в DataSet.
В таком случае, как я понимаю, данные от интерфейса будут успешно отделены. Объект DataSet можно будет сериализовать и все мои вопросы по сабжу будут исчерпаны.
Кому-нибудь может стать интересен исход всей это дилеммы, поэтому я позже снова отчитаюсь.

Добавлено через 4 часа 31 минуту
В общем создал я DataSet
Создал там две DataTable
и указал их как источники данных для моих DataGridView
На ночь глядя башка варить перестала... Как теперь данные вводить, я не понимаю.
Создал форму для ввода целой строки в таблицу. При нажатии на кнопку она и вызывается.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void customerGrid_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (customerGrid.CurrentCell.ColumnIndex == 2)
            {
                var row = customerGrid.CurrentRow;
                InputCustomer form = new InputCustomer();
                var Control = form.Controls["requirement"];
                Control.Text = row.Cells[1].Value.ToString();
                form.ShowDialog();
                if (form.ShowDialog() == DialogResult.OK)
                {
                // ??????????
                }
            }
        }
Ввожу данные в TextBox. При нажатии на ОК строка парсируется и каким-то образом должна быть добавлена в источник данных. Что писать вместо знаков вопроса?

Добавлено через 10 часов 44 минуты
up.
1
24 / 24 / 10
Регистрация: 02.09.2014
Сообщений: 137
30.10.2015, 13:31
Цитата Сообщение от Vulpes93 Посмотреть сообщение
В форме. Пользователь заполняет две таблицы, и на основе данных из этих таблиц алгоритм заполняет третью таблицу. Третья таблица это просто решение задачи, ее я экспортирую в Excel. А первые две нужно будет сохранять, чтобы была возможность редактировать данные.
Касательно экспорта в EXCEL то вот рабочий пример
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
private void btnExport_Click(object sender, EventArgs e)
        {
            Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel.Workbook ExcelWorkBook;
            Microsoft.Office.Interop.Excel.Worksheet ExcelWorkSheet;
            //Книга.
            ExcelWorkBook = ExcelApp.Workbooks.Add(System.Reflection.Missing.Value);
            //Таблица.
            ExcelWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)ExcelWorkBook.Worksheets.get_Item(1);
            for (int i = 1; i < dgvDb_view.Columns.Count + 1; i++)
            {
                ExcelApp.Cells[1, i] = dgvDb_view.Columns[i - 1].HeaderText;
            }
            for (int i = 0; i < dgvDb_view.Rows.Count; i++)
                {
 
                for (int j = 0; j < dgvDb_view.ColumnCount; j++)
                    {
                    
 
                    ExcelApp.Cells[i + 2, j + 1] = dgvDb_view.Rows[i].Cells[j].Value;
                    }
                }
                //Вызываем нашу созданную эксельку.
            ExcelApp.Visible = true;
            ExcelApp.UserControl = true;
        }
На счет остального. Ты уже используешь DataSet, Adapter.Update не должен стать проблемой для сохранения, если ты подключаешь данные
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
30.10.2015, 14:39
Цитата Сообщение от Vulpes93 Посмотреть сообщение
При нажатии на ОК строка парсируется и каким-то образом должна быть добавлена в источник данных. Что писать вместо знаков вопроса?
Вот здесь подробно расписано, с рабочими примерами.
0
 Аватар для Vulpes93
1 / 1 / 0
Регистрация: 22.04.2013
Сообщений: 16
30.10.2015, 17:38  [ТС]
Можно ли применить SQL запрос к DataTable?
Мне нужно к таблице применить запрос
SQL
1
DBCC CHECKIDENT (MyTable, RESEED, NewValue)
Чтобы заново проиндексировть записи.

Просто я удаляю, допустим, вторую запись и получается такая таблица
1 - blabla
3 - blabla

Нужно как-нибудь пронумеровать заного
0
 Аватар для Vulpes93
1 / 1 / 0
Регистрация: 22.04.2013
Сообщений: 16
07.11.2015, 17:36  [ТС]
Логически тема закрыта.
Привязал гриды к DataSet, формой ввода таблицы заполняются
BinaryFormatter сериализует DataSet в файл и обратно. Всё работает.
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
namespace TransportationProblem
{
    [Serializable()]
    public partial class MainForm : Form
    {
 
        public DataTable customerDataTable, supplierDataTable;
        DataSet mainDataSet;
        private bool dataChanged = false;
        private string currentPath { get ; set; }
 
        private void MainForm_Load(object sender, EventArgs e)
        {
            // Конструирование источников данных
            CustomerTable customerTable = new CustomerTable();
            customerDataTable = customerTable.CreateTable();
            SupplierTable supplierTable = new SupplierTable();
            supplierDataTable = supplierTable.CreateTable();
            NorthwestRuleDataSet dataSet = new NorthwestRuleDataSet();
            mainDataSet = dataSet.CreateSet(customerDataTable, supplierDataTable);
            // Привязка таблиц DataGridView к источникам данных
            customerGrid.DataSource = mainDataSet.Tables[0];
            supplierGrid.DataSource = mainDataSet.Tables[1];
        } 
 
 
        private void SaveAs()
        {
            SaveFileDialog save = new SaveFileDialog(); // NWR = Northwest Rule
            save.Filter = "Northwest rule файл данных (*.nwr)|*.nwr";
            save.Title = "Сохранить";
            save.InitialDirectory = Environment.CurrentDirectory;
            save.ShowDialog();
 
            if (save.FileName != "")
            {
                currentPath = Path.GetFullPath(save.FileName);
                FileStream fs = new FileStream(currentPath, FileMode.Create);
                BinaryFormatter serializer = new BinaryFormatter();
                serializer.Serialize(fs, mainDataSet);
                dataChanged = false;
                fs.Dispose();
                fs.Close();
            }              
 
        private void Deserialize(FileStream fileStream)
        {
            BinaryFormatter serializer = new BinaryFormatter();
            mainDataSet = (DataSet)serializer.Deserialize(fileStream);
            customerDataTable = mainDataSet.Tables[0];
            supplierDataTable = mainDataSet.Tables[1];
            customerGrid.DataSource = customerDataTable;
            supplierGrid.DataSource = supplierDataTable;
            dataChanged = false;
        }
 
        private void Open()
        {
            OpenFileDialog open = new OpenFileDialog();
            open.Filter = "Northwest rule файл данных (*.nwr)|*.nwr");
            open.InitialDirectory = Environment.CurrentDirectory;
            if (open.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    FileStream fs = File.OpenRead(open.FileName);
                    if (fs != null)
                    {
                        using (fs)
                        {
                            Deserialize(fs);
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Ошибка: невозможно открыть файл.\n " + ex.Message);
                }
                finally
                {
                    form.Dispose();
                    form.Close();
                }
            }
 
        }
        private void btnAdd1_Click(object sender, EventArgs e)
        {
            InputCustomer form = new InputCustomer();
            var Control = form.Controls["requirement"];
            if (form.ShowDialog() == DialogResult.OK)
            {
                    customerDataTable.Rows.Add(new object[] { customerGrid.Rows.Count + 1, float.Parse(Control.Text) });
                    MessageBox.Show(ex.Message);                
            }
        }
    }
}
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
08.11.2015, 21:46
Может я что-то пропустил, но зачем тут BinaryFormatter? Есть же
C#
1
dataSet1.WriteXml(filename)
и
C#
1
dataSet1.ReadXml(filename)
0
 Аватар для Vulpes93
1 / 1 / 0
Регистрация: 22.04.2013
Сообщений: 16
09.11.2015, 20:36  [ТС]
полная фигня
в байтах пишет быстрее и компактнее
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
09.11.2015, 21:19
Цитата Сообщение от Vulpes93 Посмотреть сообщение
полная фигня
в байтах пишет быстрее и компактнее
Понятное дело, но код зато упрощается. Данные такого размера, при котором эти параметры начинают иметь значение, по-моему лучше вообще хранить в БД. А просто для табличек с формы я все время использую эти методы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.11.2015, 21:19
Помогаю со студенческими работами здесь

Сохранить сложный объект в файл и потом загрузить его
Приветствую всех. Имеется примерно такой код: class Array { ............ double* Cols; ........... }

Массив из файла загрузить в DataGridView
Есть ТЗ по которому массив из файла А нужно загрузить на форму в DataGridViev, обработать и вывести результаты. Вопрос: какие...

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

Как загрузить информацию из текстового файла в DataGridView
подскажите,как при нажатии кнопки перенести данные из текстового файла в datagridview. данные в файле отделяются символом #, столбцы...

Сохранить DataGridView в файл.
Я работаю с Windows Form Application и мне нужно, чтобы при нажатии кнопки информация, записанная мной в DataGridView записывалась в файл....


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru