Как экспортировать значения столбца флажка 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 не поддерживает копирование данных из него.

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

Другие вопросы по тегам