Список из datagridview дает System.InvalidCastException

У меня есть класс под названием GetKoord, в котором я хочу прочитать GetKoord getKoord = new GetKoord (); // Открывает диалог файла и назначает путь к файлу в текстовое поле OpenFileDialog browseButton = new OpenFileDialog (); private void browse_Click ( отправитель объекта , EventArgs e ) { DGV = nylpDgv ; browseButton . Фильтр = "Файлы Excel * * .xlsx; *. Xls; *. Xlsm; *. Csv" ; if ( browseButton , ShowDialog () == DialogResult . ОК ) { ExcelPath . Текст = browseButton . FileName ; fileExcel = ExcelPath . Текст ; // SetAttributeValue (ExcelPath, fileExcel); // nylp (); / * //// IMPORTERER 10TAB-DATA FRA EXCEL TIL DATAGRIDVIEW //// tenTabLine.fileExcel = fileExcel; tenTabLine.tenTab (tenTabDgv); * / //// IMPORTERER NYLPDATA TIL DATAGRIDVIEW //// nylpLine . fileExcel = fileExcel ; nylpLine . nylpData ( nylpDgv ); //// TAR DATA I NYLPDGV DATAGRIDVIEW OG BEREGNER VERTIKALE ELEMENTER //// vertElementer . vertBueDGV ( nylpDgv , vertElementerDgv ); //// HENTER KOORDINATER //// var TEST = getKoord . vertList ( vertElementerDgv ); // ЭТО ПРИЧИНА ОШИБКИ MessageBox . Показать ( ТЕСТ [ 5 ]. ElNr . ToString ()); } else return ; } from и поместить его в список. Я создал класс класса GetKoord { List <vertEl> vertTEST = new List <vertEl> (); public List <vertEl> vertList ( DataGridView VertElementer ) { for ( int i = 0 ; i < VertElementer . Строки . Count - 1 ; i ++) { vertTEST . Добавить ( новый vertEl { elNr = ( int ) VertElementer . Строки [ i ]. Ячейки [ 0 ]. Значение , p1 = ( double ) VertElementer . Строки [ i ]. Ячейки [ 1 ]. Значение , p2 = ( double ) VertElementer . Строки [ I ]. Клетка [ 2 ]. Значение , z1 = ( двойные ) VertElementer . Строки [ я ]. Клетка [ 3 ]. Значение , z2 = ( дважды ) VertElementer . Ряды [ I ]. Клетка [ 4 ]. Значение , heln1 = ( double ) VertElementer . Строки [ i ]. Ячейки [ 5 ]. Значение , heln2 = ( double ) VertElementer . Строки [ i ]. Ячейки [ 6 ]. Значение }); } return vertTEST ; } / * public double zKoord (double pNr) {// zKoord () = return zKoord (pNr); } * / } класс vertEl { private int _elNr ; частный двойной _p1 ; частный двойной _p2 ; частный двойной _z1 ; частный двойной _z2 ; частный двойной _nylpRad ; частный двойной _heln1 ; частный двойной _heln2 ; public int elNr { get { return _elNr ; } set { _elNr = значение ; } } public double p1 { get { return _p1 ; } set { _p1 = значение ; } } public double p2 { get { return _p2 ; } set { _p2 = значение ; } } public double z1 { get { return _z1 ; } set { _z1 = значение ; } } public double z2 { get { return _z2 ; } set { _z2 = значение ; } } public double nylpRad { get { return _nylpRad ; } set { _nylpRad = значение ; } } public double heln1 { get { return _heln1 ; } set { _heln1 = значение ; } } public double heln2 { get { return _heln2 ; } set { _heln2 = значение ; } } }, который я сделал, потому что сначала я получил ошибку с рекурсивным методом stackoverflowexception.

Проблема с этим кодом возникает, когда я в своем публичном частичном классе пытаюсь создать список из vertElementerDgv. Цикл в моем классе для добавления элементов списка не работает должным образом и дает исключение.

Я ценю всю помощь, которую я могу получить! vertTEST . Добавить ( новый vertEl { elNr = Convert . ToInt32 ( VertElementer . Строки [ i ]. Ячейки [ 0 ]. Значение ), p1 = Преобразование . ToDouble ( VertElementer . Строки [ i ]. Ячейки [ 1 ]. Значение ), p2 = Преобразование . ToDouble ( VertElementer . Ряды [ я ]. Клетка [ 2 ]. Значение ), z1 = Преобразовать . ToDouble ( VertElementer . Ряды [ я ]. Клетка [ 3 ]. Значение ), z2 = Преобразовать . ToDouble ( VertElementer . Ряды [ я ]. Клетка [ 4 ]. значение ), heln1 = Преобразовать . ToDouble ( VertElementer . Ряды [ я ]. Клетка [ 5 ]. значение ), heln2 = Преобразовать . ToDouble ( VertElementer . Ряды [ я ]. Клетка [ 6 ]. значение ) }); некоторая информация отсутствует, скажите мне, и я предоставлю ее как можно лучше.

Value

Класс GetKoord и класс vertEl следующие:

DataGridView

c#,class,for-loop,datagridview,

0

Ответов: 2


0

Типы данных Excel не всегда та, которую вы ожидаете, и вы бросаете. Вы должны преобразовать значения самостоятельно:

tryParse

0

Из того, что показывают ваши комментарии и код, я уверен, что вы получаете эту ошибку от одного из Valueконверсий. Например, если одна из ячеек в foreachпустом, и вы пытаетесь отбросить это «Empty»? значение в double вы получите эту ошибку.

Проверка этих нулевых значений и неправильных форматов чисел должна выполняться в любом случае, но особенно при попытке передать строку в число. Всегда есть вероятность, что строка не является числом. Предполагая, что все значения верны, другой возможностью является добавленная строка в a DataGridView. Поэтому, просто угадывая здесь, я бы предложил два способа помочь найти, откуда эта ошибка. Сначала проверьте нулевые значения и используйте a, vertElчтобы помочь избавиться от плохих значений int / double. Также используйте a tempIntдля циклического перемещения по строкам.

Сначала создайте новый список для хранения vertElобъектов. Для каждого результата используются переменные tempDoubleи tryParseпеременные tryParse. Возможно, вы видели ifиспользование в ifзаявлении, как показано ниже.

Int result = 0;
If (int.tryParse(someString, out result) {
  // here the parse was successful a€“ result is a valid number
}
else {
  //  either null or bad number format a€“ result is still valid and is set to zero.
}

Это один из способов узнать, откуда исходит ваша ошибка, добавив проверку нулевой ячейки, или значение в ячейке - это формат с плохим номером. В приведенном ниже коде просто игнорируются плохие значения и задается значение по умолчанию для нуля (0) для этих плохих значений. tryParseВернет ложь , если строка является пустой или неверный формат номера. В этом случае нам действительно все равно, какой из них; мы просто установим это значение в ноль (0), что является tryParseвозвратом в свою переменную out при разборе синтаксического анализа. Поэтому проверка того, что это не удается или не удается, не является необходимым. Если это не удается, возвращаемое число будет равно нулю. Надеюсь это поможет.

private List<vertEl> GetVertList() {
  List<vertEl> vertTEST = new List<vertEl>();
  int tempInt = 0;
  double tempDouble = 0.0;
  foreach (DataGridViewRow row in VertElementer.Rows) {
    if (!row.IsNewRow) {
      vertEl vert1 = new vertEl();
      int.TryParse(row.Cells[0].Value.ToString(), out tempInt);
      vert1.elNr = tempInt;
      double.TryParse(row.Cells[1].Value.ToString(), out tempDouble);
      vert1.p1 = tempDouble;
      double.TryParse(row.Cells[2].Value.ToString(), out tempDouble);
      vert1.p2 = tempDouble;
      double.TryParse(row.Cells[3].Value.ToString(), out tempDouble);
      vert1.z1 = tempDouble;
      double.TryParse(row.Cells[4].Value.ToString(), out tempDouble);
      vert1.z2 = tempDouble;
      double.TryParse(row.Cells[5].Value.ToString(), out tempDouble);
      vert1.heln1 = tempDouble;
      double.TryParse(row.Cells[6].Value.ToString(), out tempDouble);
      vert1.heln2 = tempDouble;
      vertTEST.Add(vert1);
    }
  }
  return vertTEST;
}
C #, класс, для цикла, DataGridView,
Похожие вопросы