【问题标题】:List from datagridview gives System.InvalidCastException来自 datagridview 的列表给出 System.InvalidCastException
【发布时间】:2017-06-19 11:32:51
【问题描述】:

我有一个名为 GetKoord 的类,我想从中读取数据网格视图并将其放入列表中。我创建了一个类 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; }
    }
}

【问题讨论】:

  • 你遇到了什么错误?
  • Screenshot 见截图。它说 InvalidCastException。编辑:如果我注释掉 heln1 和 heln2 代码有效: //heln1 = (double)VertElementer.Rows[i].Cells[5].Value, //heln2 = (double)VertElementer.Rows[i].Cells[ 6].值

标签: c# class for-loop datagridview


【解决方案1】:

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

【讨论】:

  • //heln1 = (double)VertElementer.Rows[i].Cells[5].Value,如果我注释掉 heln1 就可以了。实际上我没有从 Excel 中获取值。最初我这样做,但我有一个从 datagridview (nylpDGV) 到另一个 datagriview (vertElementerDgv) 的计算,我希望将计算值存储为我将它们转换为的类型。
【解决方案2】:

从您的 cmets 和代码显示的内容来看,我确信您会从 Value 转换之一中收到此错误。例如,如果DataGridView 中的一个单元格为空,并且您尝试将此“空”值强制转换为双精度值,则会收到此错误。

无论哪种方式都应该检查这些空值和错误的数字格式,尤其是在尝试将字符串转换为数字时。字符串总是有可能不是数字。假设这些值都是正确的,另一种可能性是在DataGridView 中添加的行。所以只是在这里猜测一下,我会建议两种方法来帮助找到这个错误的来源。首先,检查空值并使用tryParse 来帮助清除错误的 int/double 值。还可以使用 foreach 循环遍历行。

首先创建一个新列表来保存vertEl 对象。 tempInttempDouble 变量用于保存每个 tryParse 结果。您可能已经看到tryParse 用在if 语句中,如下所示

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)。如果字符串为空或无效的数字格式,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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多