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