在我的应用程序中,我从数据库加载一个小数据表,并使用数据表将列绑定到组合框下拉列表。
每次显示组合框时,我都相信它会从数据库中提取数据,这似乎是不必要的,因为数据几乎不会发生任何变化。
当应用程序打开时,有没有办法在内存中加载一次数据表,然后在表单中反复使用它?
请解释这将如何运作的基本机制。
答案 0 :(得分:1)
您可以使用共享变量/对象来保存winforms中的数据。
答案 1 :(得分:0)
将您的数据表作为主要表单的属性,如下所示:
private DataTable _dataSource;
private DataTable DataSource
{
get
{
if (_dataSource == null)
{
// Fill your _dataSource
}
return _dataSource;
}
}
并使用此属性绑定您的下拉列表。 _dataSource将是一个与主表单实例相对应的全局变量。
答案 2 :(得分:0)
我在这种情况下使用静态类:
public static class OraProvider
{
private static Dictionary<string, DataTable> _cachedDateTable;
...
public static DataTable GetTable(string Table, bool cache)
{
if (cache && _cachedDateTable.ContainsKey(Table))
{
return _cachedDateTable[Table];
}
if (Connection.State == ConnectionState.Open)
{
DataTable dt = new DataTable(Table);
commonCommand.CommandText = "SELECT * FROM " + Table;
commonCommand.Connection = Connection;
commonDataAdapter.Fill(dt);
if (cache)
{
_cachedDateTable.Add(Table, dt);
}
else
{
if (_cachedDateTable.ContainsKey(Table))
{
_cachedDateTable.Remove(Table);
_cachedDateTable.Add(Table, dt);
}
}
return dt;
}
else
{
return null;
}
}
...
}
答案 3 :(得分:0)
有两种(如果不是更多)可能的方式:
一种方法是在项目中添加一个类型化数据集,并手动创建一个包含相应列的表。然后,创建代码以填充该表,并使用BindingSource将其作为数据源添加到列中。
您还可以使用对象数据源
声明一个包含公共成员的类(例如MyDataClass
)(必须是读/写属性IIRC。如果这不起作用,请创建公共成员变量)以获取ID和值。在表单中声明一个通用列表,如
private List<MyDataClass> m_dataSource = new List<MyDataClass>();
此列表将用作列的数据源。对于要在组合框中显示的每个值,使用MyDataClass
的一个实例填充列表。
然后,在项目中为MyDataClass
类创建一个新的对象数据源。我正在使用德语VS2008,所以我不知道菜单项的确切名称。它应该是“Data&gt; Show DataSources”并且在数据源工具窗口中:添加新的数据源。在以下对话框中,选择“对象”并选择类MyDataClass
。
然后,您将获得一个新数据源,其中包含上面声明的属性的成员。将BindingSource添加到表单和对象数据源的一个实例。将其分配给BindingSource(这样您就可以使用设计器来选择字段等)。将BindingSource指定为列的DataSource,并相应地选择ValueMember
和DataMember
属性。
然后,在代码中,将数据加载到通用列表后,将m_dataSource
分配给BindingSource的DataSource属性:
bindingSource.DataSource = m_dataSource;
请记住,我是从记忆中写下来的 - 可能涉及更多步骤,但它应该与我所描述的相似。