Как экспортировать значения столбца флажка datagridview, сохраненные в списке, в Excel
У меня есть class
и Form1
, В моем class
Я создал переменные для сохранения моих данных.
Savestate.cs
public static List<string> plate_list = new List<string>();
public static List<string> checkbox_list = new List<string>();
Тогда по моему Form1
Я сохранил данные textbox1
а также chk
в переменные через button1
, Обе данные соответствуют друг другу. Затем я экспортирую их в Excel через button2
, Ниже мой код:
Form1.cs
private void button1_Click(object sender, EventArgs e)
{
Savestate.plate_list.Add(textbox1.Text);
foreach (DataGridViewRow dataGridRow in dataGridView1.Rows)
{
DataGridViewCheckBoxCell chk = dataGridRow.Cells[1] as DataGridViewCheckBoxCell;
if (Convert.ToBoolean(Convert.ToInt32(chk.Value)) == true)
{
Savestate. checkbox_list.Add("P");
}
else if (Convert.ToBoolean(chk.Value) == false)
{
Savestate. checkbox_list.Add("O");
}
}
}
//snippet of codes for exporting variables into excel
private void button2_Click(object sender, EventArgs e)
{
int _lastRow1 = oSheet1.Range["C" + oSheet1.Rows.Count].End[Excel.XlDirection.xlUp].Row + 1;
rng = oSheet1.Range[oSheet1.Cells[_lastRow1, 2], oSheet1.Cells[_lastRow1, 10]];
foreach (var data in Savestate.plate_list)
{
oSheet1.Cells[_lastRow1, 1] = data;
foreach (var other in Savestate. checkbox_list)
{
rng.Value = other;
(another loop here to read the checkbox list values?)
}
_lastRow1++;
}
}
С помощью этих кодов я могу правильно циклически проходить по номеру моей таблички, но для моих значений флажков экспортируются только последние значения, см. Здесь (я сохранил 2 номера табличек, поэтому должно быть 2 набора значений флажков, но только 1 набор флажков значения экспортируются). Я чувствую, что мне нужно сделать еще один цикл специально для значений флажка, но я не знаю, как начать. Надеюсь получить помощь. Спасибо!
1 ответ
Было бы намного проще, если бы вы сделали следующее:
Щелкните правой кнопкой мыши проект в обозревателе решений.
Выберите Добавить новый...
Добавить новый набор данных в проект
Дважды щелкните DataSet, появится нечто вроде конструктора базы данных.
Щелкните правой кнопкой мыши область дизайна, выберите New DataTable, назовите его соответствующим образом
Несколько раз щелкните правой кнопкой мыши DataTable, выберите "Добавить столбец" и добавьте все столбцы, в которых вы хотите сохранить свои данные. Установите тип каждого столбца, например, String, Int, Boolean и т. Д.
Сохраните свой DataSet
Вернитесь к дизайнеру форм, перейдите в соответствующее меню, чтобы отобразить окно "Источники данных" для вашей версии Visual Studio. Google, если вы не знаете, как это показать. Пример для версии 2017: https://docs.microsoft.com/en-us/visualstudio/data-tools/add-new-data-sources?view=vs-2017
В окне источников данных есть дерево, а одним из узлов является ваша DataTable. Перетащите его на дизайнер форм. Появится сетка данных со столбцами, подходящими для типов данных. Столбцы Bool являются флажком. Представление datagrid связано с объектом DataSet, который содержит экземпляр вашей таблицы данных. Все, что вы вводите в сетку, сохраняется в таблице данных. Вы можете удалить Bindingnavigator, который появляется, если вы не хотите его
Щелкните правой кнопкой мыши решение в обозревателе решений, выберите "Управление пакетами Nuget для решения".
В диспетчере пакетов слепков нажмите кнопку Обзор, а затем введите EPPLUS в поле поиска. Установите библиотеку epplus в свой проект. Закройте менеджер пакетов nuget
Дважды щелкните кнопку "Сохранить" в форме. Добавьте ~3 строки кода, необходимые для того, чтобы epplus создал ваш файл Excel из таблицы DataTable. Более подробную информацию можно найти здесь: Экспорт DataTable, чтобы преуспеть с EPPlus
в этой ссылке вам нужно подставить имя вашей DataTable в вызов LoadFromDataTable. Он находится внутри DataSet на вашем от, поэтому будет что-то вроде yourDataSetName.YourDataTabkeName
Выше приведено воплощение концепции под названием MVC-модель, вид, контроллер. Суть этого в том, что ваши данные живут в специальном контейнере, называемом моделью (в этом примере DataSet/DataTable), и они отображаются на экране представлением (datagridview) и снова контролируются / изменяются чем-то другим (хотя в этом пример и во многих, datagridview также является контроллером, в некоторой степени). Дни создания сложного элемента управления в форме, например вида сетки, и хранения данных внутри него, должны были закончиться с помощью VB6:). Хотя иногда все же удобнее хранить данные, например, в текстовых полях, и извлекать их с помощью textbox.Text для простых сценариев, все эти элементы управления поддерживают привязку данных, и идея, что если ваша программа обрабатывает несколько записей данных и просматривает их, означает, что все данные должны храниться в модели, все элементы управления, которые их отображают и редактируют, подключаются к модели, и все они понимают концепцию навигации по модели - вы изменяете текущую запись, на которую ссылаетесь в модели, и весь текст поля и т.д. изменяют данные, которые они показывают, автоматически. Вы не заходите в каждый элемент управления и не помещаете туда данные неоднократно, а потом сами копаете их
Как только вы поймете парадигму MVC, она откроет вам возможность использовать функциональность, на которую другие разработчики тоже нацелены, в этом случае EPPlus, вы можете просто передать ей модель данных (DataSet/DataTable) и сказать "здесь, запишите это в файл" и это сделает это. Вы не можете передать свое сетевое представление в epplus, поскольку данные не должны храниться в сетевом представлении в соответствии с принципами MVC, поэтому epplus не поддерживает копирование данных из него.
Если ничего другого, надеюсь, вы сможете оценить, что вышеприведенный набор шагов, хотя и выглядит длинным, когда я его набрал, на самом деле включает меньше времени, меньше щелчков мышью и значительно меньше строк кода, чем вы уже написали до сих пор.