2017-02-02 19 views
0

私はGetKoordと呼ばれるクラスを持っています。そこからDataGridViewを読み込んでリストに入れたいと思っています。私は最初に再帰的なstackoverflowexceptionでエラーが発生したので、私が作ったクラスvertElを作った。DataGridviewからのリストはSystem.InvalidCastExceptionを返します

私がパブリックな部分クラスにいるとき、このコードの問題は、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; } 
    } 
} 
+0

どのようなエラーが表示されますか? – kritikaTalwar

+0

[スクリーンショット](https://content.screencast.com/users/fjaosl/folders/Jing/media/62d7ba82-711a-46ea-b957-db99ddcc85a0/2017-02-023030.png) スクリーンショットを参照してください。それはInvalidCastExceptionと言います。 編集:私はheln1をコメントアウトし、heln2コードが動作する場合: // heln1 =(ダブル)VertElementer.Rows [I] .Cells [5] .Valueの、 // heln2 =(ダブル)VertElementer.Rows [i] .Cells [6] .Value – Grohl

答えて

0

エクセルのデータ型は常に、あなたが期待しているとあなたにキャストされている1つはありません。あなたのコメントとコードのショーは、私はあなたがValue変換のいずれかからこのエラーを得ていると確信していたものから

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) 
}); 
+0

// heln1 =(double)VertElementer.Rows [i] .Cells [5]。値、 私がheln1をコメントアウトすると動作します。実際に私はExcelから値を取得していません。当初は行っていましたが、datagridview(nylpDGV)から別のdatagriview(vertElementerDgv)への計算があります。計算された値が変換された型として保存されることを期待しています。 – Grohl

0

:あなたはあなた自身で値を変換する必要があります。たとえば、DataGridViewのセルの1つが空で、この "空"値を2倍にキャストしようとすると、このエラーが発生します。

これらのヌル値と不正な数値の形式を調べるには、いずれかの方法で行う必要がありますが、特に文字列を数値にキャストしようとするときは注意が必要です。文字列は数字ではない可能性が常にあります。値がすべて正しければ、もう1つの可能性はDataGridViewの行に追加されます。ここで推測するだけで、このエラーがどこから来ているのかを見つけるのを助ける2つの方法を提案します。まず、ヌル値をチェックし、tryParseを使用して、不正なint/double値を除外するのを助けます。また、行をループするにはforeachを使用します。

最初にvertElオブジェクトを保持する新しいリストを作成します。変数tempIntおよびtempDoubleは、それぞれの結果を保持するために使用されます。あなたはこれを使用すると、セルにNULLのセルまたは値のチェックを追加して、エラーがどこから来ている見つけ出すことができ一つの方法がされている

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. 
} 

下回るよう if文で使用 tryParseを見たことがあるかもしれませ不良番号フォーマット。以下のコードは、単に不良値を無視し、これらの不良値のデフォルト値をゼロ(0)に設定しています。 tryParseは、文字列がnullまたは無効な数値形式の場合はfalseを返します。この場合、私たちは本当にどちらに気をつけません。この値をゼロ(0)に設定するだけです。これは、解析が失敗したときにout変数に tryParseが返す値です。だから、失敗か失敗かをチェックする必要はありません。失敗した場合、返される数値は0になります。お役に立てれば。

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; 
} 
関連する問題