C# C数据表错误
我在ListView上打印了一个数据表,它工作得很好,但在某个时候,它开始显示这些错误。此项目的解决方法是: 用户填充WinForms,然后在数据库中插入,当用户完成时,显示MainForm,调用RealizarFormulario方法,因此ListView将填充新数据 编辑 此错误中的第156行是item.SubItems.Addrow[1].ToString;但它也给了我153155。。。里面的一切 21-05 17:00>异常:Tipo:System.InvalidOperationException 门萨耶:收藏被修改;枚举操作可能无法执行 处决Origen:系统。数据堆栈跟踪:在 System.Data.RBTree`1.RBTreeEnumerator.MoveNext at C:\Documents中的Operaciones_Diversas.Principal.formulario 和设置\usuario\mis documentos\visualstudio 2010\Projects\Operaciones Diversas\Operaciones Diversas\Principal.cs:第156行 填充数据的代码如下C# C数据表错误,c#,database,list,C#,Database,List,我在ListView上打印了一个数据表,它工作得很好,但在某个时候,它开始显示这些错误。此项目的解决方法是: 用户填充WinForms,然后在数据库中插入,当用户完成时,显示MainForm,调用RealizarFormulario方法,因此ListView将填充新数据 编辑 此错误中的第156行是item.SubItems.Addrow[1].ToString;但它也给了我153155。。。里面的一切 21-05 17:00>异常:Tipo:System.InvalidOperationExc
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);
}
在遍历可枚举项时修改集合。使用for循环代替foreach循环。在遍历可枚举项时修改集合。使用for循环代替foreach循环。不能在foreach中修改集合。您必须使用normal for循环。但正如我所说的,一切都很正常,错误是在几分钟前开始的,只是随机出现的……请评论这一行listaLotes.Items.Additem;一切都会好起来的again@user1381537一切都很正常,错误在几分钟前就开始了——很可能在那之前,listaLotes.Items.Additem;由于某些原因无法访问,例如旧代码正在运行或Consultas.listadoLotes.Rows集合为空。如果我这样做,@aleksey.berezan列表视图将为空…您无法在foreach中修改集合。您必须使用normal for循环。但正如我所说的,一切都很正常,错误是在几分钟前开始的,只是随机出现的……请评论这一行listaLotes.Items.Additem;一切都会好起来的again@user1381537一切都很正常,错误在几分钟前就开始了——很可能在那之前,listaLotes.Items.Additem;由于某些原因无法访问,例如旧代码正在运行或Consultas.listadoLotes.Rows集合为空。如果我这样做,@aleksey.berezan列表视图将为空…使用我的for循环,程序将比以前慢很多:S。。。是的,但是花8秒加载主窗体是不可行的。你的新代码每次循环迭代都会命中数据库。那肯定会让你慢下来。您需要在方法范围内将正在迭代的表实例化为局部变量。。。是的,但是花8秒加载主窗体是不可行的。你的新代码每次循环迭代都会命中数据库。那肯定会让你慢下来。您需要将正在迭代的表实例化为方法范围内的局部变量。