1

我在 ListView 上打印了一个 DataTable,它工作正常,但在某些时候,它开始出现这些错误。该项目的解决方法是:

用户填写 WinForms,然后在 DataBase 上插入,当用户完成时,显示 MainForm,调用该actualizarFormulario()方法,因此ListView填充了新数据。

编辑

此错误中的第 156 行是item.SubItems.Add(row[1].ToString());,但它也给了我 153、155 ......该 foreach 中的所有内容。

21-05 17:00 > 异常:类型:System.InvalidOperationException Mensaje:集合已修改;枚举操作可能不会执行。来源:System.Data Stacktrace:在 System.Data.RBTree`1.RBTreeEnumerator.MoveNext() 在 Operaciones_Diversas.Principal.actualizarFormulario() 在 C:\Documents and Settings\usuario\mis documentos\visual studio 2010\Projects\Operaciones Diversas \Operaciones Diversas\Principal.cs:第 156 行


填充数据的代码是这样的

private void actualizarFormulario()
{
    try
    {
        listaLotes.Items.Clear();
        foreach (DataRow row in Consultas.listadoLotes().Rows)
        {
            ListViewItem item = new ListViewItem(row[0].ToString());
            item.SubItems.Add(row[1].ToString());
            item.SubItems.Add(Convert.ToDecimal(row[2].ToString().Substring(0, row[2].ToString().Length - 2) + "," + row[2].ToString().Substring(row[2].ToString().Length - 2, 2)).ToString("N2", Cultures.Spain));
            item.SubItems.Add(row[3].ToString());
            item.SubItems.Add(row[4].ToString());
            listaLotes.Items.Add(item);
        }
    }
    catch (Exception ex) { Logger.log(ex); }
}

    public static DataTable listadoLotes()
    {
        try
        {
            SelectBD sel = new SelectBD(Program.ConexBD,
            "SELECT referencia, tipo, total_lote, COUNT(Documentos.id) as Documentos, cuenta FROM Lotes"
            + " LEFT JOIN Documentos"
            + " ON Lotes.referencia = Documentos.ref_lote"
            + " WHERE Lotes.fecha_creacion='" + valoresGenerales.dateHoy + "'"
            + " GROUP BY Lotes.referencia, Lotes.tipo, Lotes.total_lote, Lotes.cuenta"
            + " ORDER BY Lotes.tipo"
            );
            return sel.DataTable;
        }
        catch (Exception ex)
        {
            Logger.log(ex);
            return new DataTable();
        }
    }

编辑 2

使用 for循环,正在提高我的程序速度,但不能这样,因为用户需要与一切快速交互......

for (int i = 0; i < Consultas.listadoLotes().Rows.Count; i++)
{
    ListViewItem item = new ListViewItem(Consultas.listadoLotes().Rows[i]["referencia"].ToString());
    item.SubItems.Add(Consultas.listadoLotes().Rows[i]["tipo"].ToString());
    item.SubItems.Add(Convert.ToDecimal(Consultas.listadoLotes().Rows[i]["total_lote"].ToString()
        .Substring(0, Consultas.listadoLotes().Rows[i]["total_lote"].ToString().Length - 2)
        + ","
        + Consultas.listadoLotes().Rows[i]["total_lote"].ToString()
        .Substring(Consultas.listadoLotes().Rows[i]["total_lote"].ToString().Length - 2, 2)).ToString("N2", Cultures.Spain));
    item.SubItems.Add(Consultas.listadoLotes().Rows[i]["Documentos"].ToString());
    item.SubItems.Add(Consultas.listadoLotes().Rows[i]["cuenta"].ToString());
    listaLotes.Items.Add(item);
}

编辑 3 工作代码

        listaLotes.Items.Clear();
        DataTable tabla = Consultas.listadoLotes();
        for (int i = 0; i < tabla.Rows.Count; i++)
        {
            ListViewItem item = new ListViewItem();
            item.SubItems.Add(tabla.Rows[i]["referencia"].ToString());
            item.SubItems.Add(tabla.Rows[i]["tipo"].ToString());
            item.SubItems.Add(Convert.ToDecimal(tabla.Rows[i]["total_lote"].ToString()
                .Substring(0, tabla.Rows[i]["total_lote"].ToString().Length - 2)
                + ","
                + tabla.Rows[i]["total_lote"].ToString()
                .Substring(tabla.Rows[i]["total_lote"].ToString().Length - 2, 2)).ToString("N2", Cultures.Spain));
            item.SubItems.Add(tabla.Rows[i]["Documentos"].ToString());
            item.SubItems.Add(tabla.Rows[i]["cuenta"].ToString());
            listaLotes.Items.Add(item);
        }
4

1 回答 1

6

在迭代可枚举时,您正在修改集合。不要foreach使用循环,而是使用for循环。

于 2013-05-21T15:17:35.827 回答