Типы данных Excel не всегда та, которую вы ожидаете, и вы бросаете. Вы должны преобразовать значения самостоятельно:
tryParse
У меня есть класс под названием 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,
Из того, что показывают ваши комментарии и код, я уверен, что вы получаете эту ошибку от одного из 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;
}