[英]List from datagridview gives System.InvalidCastException
我有一個名為GetKoord的類,我想從中讀取datagridview並將其放入列表中。 我制作了一個vertEl類,因為首先遇到了遞歸stackoverflowexception的錯誤。
當我在公共局部類中嘗試從vertElementerDgv列出列表時,就會出現此代碼的問題。 我的類中添加列表項的循環無法正常工作,並給出了異常。
我感謝我能獲得的所有幫助! 如果缺少某些信息,請告訴我,我會盡力提供。
GetKoord getKoord = new GetKoord();
//Opens the file dialog and assigns file path to Textbox
OpenFileDialog browseButton = new OpenFileDialog();
private void browse_Click(object sender, EventArgs e)
{
DGV = nylpDgv;
browseButton.Filter = "Excel Files |*.xlsx;*.xls;*.xlsm;*.csv";
if (browseButton.ShowDialog() == DialogResult.OK)
{
ExcelPath.Text = browseButton.FileName;
fileExcel = ExcelPath.Text;
//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); //THIS IS CAUSING ERROR
MessageBox.Show(TEST[5].elNr.ToString());
}
else return;
}
GetKoord類和vertEl類如下所示:
class GetKoord
{
List<vertEl> vertTEST = new List<vertEl>();
public List<vertEl> vertList(DataGridView VertElementer)
{
for (int i = 0; i<VertElementer.Rows.Count - 1; i++)
{
vertTEST.Add(new vertEl
{
elNr = (int)VertElementer.Rows[i].Cells[0].Value,
p1 = (double)VertElementer.Rows[i].Cells[1].Value,
p2 = (double)VertElementer.Rows[i].Cells[2].Value,
z1 = (double)VertElementer.Rows[i].Cells[3].Value,
z2 = (double)VertElementer.Rows[i].Cells[4].Value,
heln1 = (double)VertElementer.Rows[i].Cells[5].Value,
heln2 = (double)VertElementer.Rows[i].Cells[6].Value
});
}
return vertTEST;
}
/*
public double zKoord(double pNr)
{
// zKoord() =
return zKoord(pNr);
}
*/
}
class vertEl
{
private int _elNr;
private double _p1;
private double _p2;
private double _z1;
private double _z2;
private double _nylpRad;
private double _heln1;
private double _heln2;
public int elNr
{
get { return _elNr; }
set { _elNr = value; }
}
public double p1
{
get { return _p1; }
set { _p1 = value; }
}
public double p2
{
get { return _p2; }
set { _p2 = value; }
}
public double z1
{
get { return _z1; }
set { _z1 = value; }
}
public double z2
{
get { return _z2; }
set { _z2 = value; }
}
public double nylpRad
{
get { return _nylpRad; }
set { _nylpRad = value; }
}
public double heln1
{
get { return _heln1; }
set { _heln1 = value; }
}
public double heln2
{
get { return _heln2; }
set { _heln2 = value; }
}
}
Excel的數據類型並不總是您所期望的,而是您要轉換的。 您必須自己轉換值:
vertTEST.Add(new vertEl
{
elNr = Convert.ToInt32(VertElementer.Rows[i].Cells[0].Value),
p1 = Convert.ToDouble(VertElementer.Rows[i].Cells[1].Value),
p2 = Convert.ToDouble(VertElementer.Rows[i].Cells[2].Value),
z1 = Convert.ToDouble(VertElementer.Rows[i].Cells[3].Value),
z2 = Convert.ToDouble(VertElementer.Rows[i].Cells[4].Value),
heln1 = Convert.ToDouble(VertElementer.Rows[i].Cells[5].Value),
heln2 = Convert.ToDouble(VertElementer.Rows[i].Cells[6].Value)
});
根據您的注釋和代碼顯示的內容,我相信您是從Value
轉換之一中得到此錯誤的。 例如,如果DataGridView
中的單元格之一為空,而您嘗試將此“ Empty”值強制轉換為雙精度值,則會收到此錯誤。
無論哪種方式都應該檢查這些空值和錯誤的數字格式,但是特別是在嘗試將字符串轉換為數字時。 字符串很可能不是數字。 假設所有值都是正確的,另一種可能性是在DataGridView
添加行。 因此,僅在此處進行猜測,我將建議兩種方法來幫助查找此錯誤的來源。 首先,檢查空值,並使用tryParse
幫助清除錯誤的int / double值。 也可以使用foreach
行。
首先創建一個新的List來保存vertEl
對象。 tempInt
和tempDouble
變量用於保存每個tryParse
結果。 您可能已經在if
語句中看到了tryParse
,如下所示
Int result = 0;
If (int.tryParse(someString, out result) {
// here the parse was successful – result is a valid number
}
else {
// either null or bad number format – result is still valid and is set to zero.
}
通過添加對空單元格的檢查或該單元格中的值是錯誤的數字格式,這是您可以確定錯誤出處的一種方式。 下面的代碼僅忽略錯誤值,並為這些錯誤值設置默認值零(0)。 如果字符串為null或數字格式無效,則tryParse
將返回false。 在這種情況下,我們真的不在乎哪個。 我們將簡單地將此值設置為零(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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.