foreach 一直循环
Foreach keeps looping
所以我有这个项目需要从数据库中打印数据。
我用一个简单的 foreach 循环来做到这一点:
public void LoadDatabase()
{
_connection.Open();
_dataAdapter.Fill(_dataTable);
try
{
foreach (DataRow row in _dataTable.Rows)
{
Program.AnimalInfo.Info_ID_ListBox.Items.Add(row["Animal_ID"].ToString());
}
}
catch (Exception ex)
{
MessageBox.Show("Failed to LoadDatabase()" + ex.Message);
}
_connection.Close();
}
问题是它会循环 2 次到 6 次,这意味着它至少打印两次。
所以目前我的数据库包含 Animal_Id 的 id:1 和 id:2。
现在我进入我的列表框 (1, 2, 1, 2) 或更多取决于厕所的数量ps。我不知道为什么会这样以及如何解决这个问题。因此,我们将不胜感激所有帮助
ps:如果需要更多代码或信息,请告诉我。
pss:这是针对 windows 移动 6.5 设备,在 Visual studio 2008 中构建了 .net 3.5。我也在使用 sqlite(不是最新版本)
编辑:经过一些测试,我在这个项目中的其他 2 个 foreach loops 似乎也有同样的问题。
编辑:在你们的帮助下,我得以修复它。
public void GetData()
{
try
{
SQLiteConnection Connection = new SQLiteConnection(@"Data Source = \Program Files\Mobile\Resources\Database\PPP_DB");
Connection.Open();
SQLiteCommand Command = new SQLiteCommand(Query, Connection);
Command.ExecuteNonQuery();
Data_Adapter = new SQLiteDataAdapter("SELECT * FROM Animal_Info", Connection);
Data_Set.Reset();
Data_Adapter.Fill(Data_Set);
Data_Table = Data_Set.Tables[0];
Program.AnimalInfo.Info_ID_ListBox.Items.Clear();
foreach (DataRow row in Data_Table.Rows)
{
if (row.RowState != DataRowState.Deleted)
{
Program.AnimalInfo.Info_ID_ListBox.Items.Add(row["Animal_ID"].ToString());
}
}
Connection.Close();
Program.AnimalInfo.Refresh();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
所以它似乎在某处弄乱了 DataTable,并使其循环多次。 ps:我尝试用 Databound 之类的东西设置所有项目,但对我来说并没有真正奏效,这就是我仍然这样做的原因。
在函数顶部添加以下两行。
Program.AnimalInfo.Info_ID_ListBox.Items.Clear();
_dataTable.Clear();
这将确保您不会重复任何行数据。
假设数据库中的 "Animal_ID" 字段没有唯一约束(你没有回答我的评论),检查项目重复:
if (!Program.AnimalInfo.Info_ID_ListBox.Items.Contains(row["Animal_ID"].ToString())
Program.AnimalInfo.Info_ID_ListBox.Items.Add(row["Animal_ID"].ToString());
首先,LoadDatabase() 应该 return 一个数据表(或数据集),这使得 LoadDatabase() 函数对其他数据请求很有用,而且您永远不需要使用 'for loop'将项目添加到列表框。您可以将 ListBox 直接绑定到源....应该这样做
listBox1.DataSource = _dataTable;
listBox1.ValueMember = "Animal_ID";
listBox1.DisplayMember = "Animal_ID";
这里有一些使用 SqlDataReader 和 SqlDataAdapter 的例子http://gsidev.somee.com/#2&2AD97ECBE2AE41D08191F6E4C773D8A9&cs
此处不需要唯一约束。但可能必须清除 listbox.Items 集合。
可能您(或系统,取决于代码所在的位置,例如在绘画事件处理程序中)调用了 'LoadDatabase()' 函数两次!
只需在 _dataAdapter.fill() 中放置一个断点并按 F11 让应用程序 运行 在此之上,然后右键单击 _dataTable 以检查其内容。
虽然您可以明确设置 ListBox 的数据源,但这不是必需的,并且可能会导致您目前不知道的其他副作用。在让系统在后台做未知的事情之前,先从简单的代码开始是可以的。
试试看:
public void LoadDatabase()
{
_connection.Open();
_dataAdapter.Fill(_dataTable);
Program.AnimalInfo.Info_ID_ListBox.Items.Clear();
try
{
foreach (DataRow row in _dataTable.Rows)
{
Program.AnimalInfo.Info_ID_ListBox.Items.Add(row["Animal_ID"].ToString());
}
}
catch (Exception ex)
{
MessageBox.Show("Failed to LoadDatabase()" + ex.Message);
}
_connection.Close();
}
所以我有这个项目需要从数据库中打印数据。 我用一个简单的 foreach 循环来做到这一点:
public void LoadDatabase()
{
_connection.Open();
_dataAdapter.Fill(_dataTable);
try
{
foreach (DataRow row in _dataTable.Rows)
{
Program.AnimalInfo.Info_ID_ListBox.Items.Add(row["Animal_ID"].ToString());
}
}
catch (Exception ex)
{
MessageBox.Show("Failed to LoadDatabase()" + ex.Message);
}
_connection.Close();
}
问题是它会循环 2 次到 6 次,这意味着它至少打印两次。 所以目前我的数据库包含 Animal_Id 的 id:1 和 id:2。 现在我进入我的列表框 (1, 2, 1, 2) 或更多取决于厕所的数量ps。我不知道为什么会这样以及如何解决这个问题。因此,我们将不胜感激所有帮助
ps:如果需要更多代码或信息,请告诉我。
pss:这是针对 windows 移动 6.5 设备,在 Visual studio 2008 中构建了 .net 3.5。我也在使用 sqlite(不是最新版本)
编辑:经过一些测试,我在这个项目中的其他 2 个 foreach loops 似乎也有同样的问题。
编辑:在你们的帮助下,我得以修复它。
public void GetData()
{
try
{
SQLiteConnection Connection = new SQLiteConnection(@"Data Source = \Program Files\Mobile\Resources\Database\PPP_DB");
Connection.Open();
SQLiteCommand Command = new SQLiteCommand(Query, Connection);
Command.ExecuteNonQuery();
Data_Adapter = new SQLiteDataAdapter("SELECT * FROM Animal_Info", Connection);
Data_Set.Reset();
Data_Adapter.Fill(Data_Set);
Data_Table = Data_Set.Tables[0];
Program.AnimalInfo.Info_ID_ListBox.Items.Clear();
foreach (DataRow row in Data_Table.Rows)
{
if (row.RowState != DataRowState.Deleted)
{
Program.AnimalInfo.Info_ID_ListBox.Items.Add(row["Animal_ID"].ToString());
}
}
Connection.Close();
Program.AnimalInfo.Refresh();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
所以它似乎在某处弄乱了 DataTable,并使其循环多次。 ps:我尝试用 Databound 之类的东西设置所有项目,但对我来说并没有真正奏效,这就是我仍然这样做的原因。
在函数顶部添加以下两行。
Program.AnimalInfo.Info_ID_ListBox.Items.Clear();
_dataTable.Clear();
这将确保您不会重复任何行数据。
假设数据库中的 "Animal_ID" 字段没有唯一约束(你没有回答我的评论),检查项目重复:
if (!Program.AnimalInfo.Info_ID_ListBox.Items.Contains(row["Animal_ID"].ToString())
Program.AnimalInfo.Info_ID_ListBox.Items.Add(row["Animal_ID"].ToString());
首先,LoadDatabase() 应该 return 一个数据表(或数据集),这使得 LoadDatabase() 函数对其他数据请求很有用,而且您永远不需要使用 'for loop'将项目添加到列表框。您可以将 ListBox 直接绑定到源....应该这样做
listBox1.DataSource = _dataTable;
listBox1.ValueMember = "Animal_ID";
listBox1.DisplayMember = "Animal_ID";
这里有一些使用 SqlDataReader 和 SqlDataAdapter 的例子http://gsidev.somee.com/#2&2AD97ECBE2AE41D08191F6E4C773D8A9&cs
此处不需要唯一约束。但可能必须清除 listbox.Items 集合。
可能您(或系统,取决于代码所在的位置,例如在绘画事件处理程序中)调用了 'LoadDatabase()' 函数两次!
只需在 _dataAdapter.fill() 中放置一个断点并按 F11 让应用程序 运行 在此之上,然后右键单击 _dataTable 以检查其内容。
虽然您可以明确设置 ListBox 的数据源,但这不是必需的,并且可能会导致您目前不知道的其他副作用。在让系统在后台做未知的事情之前,先从简单的代码开始是可以的。
试试看:
public void LoadDatabase()
{
_connection.Open();
_dataAdapter.Fill(_dataTable);
Program.AnimalInfo.Info_ID_ListBox.Items.Clear();
try
{
foreach (DataRow row in _dataTable.Rows)
{
Program.AnimalInfo.Info_ID_ListBox.Items.Add(row["Animal_ID"].ToString());
}
}
catch (Exception ex)
{
MessageBox.Show("Failed to LoadDatabase()" + ex.Message);
}
_connection.Close();
}