如何只使用一种方法来填充 ComBobox 和 ListBox 的项目?
How to make only one method to populate Items of a ComBobox as well as a ListBox?
下面的过程用数据库中的值填充组合框。
还有一个用于 ListBox 的,完全相同 除了 "box" 是一个 ListBox。
CB 和 LB 类 都有 Items 并且都继承了没有 Items 的 ListControl。
我怎样才能去掉那里的重复代码?
private void UpdateBox (ComboBox box, string select, string from, string order = "")
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
if (order == "") order = select;
using (SqlCommand command = new SqlCommand("SELECT " + select +
" FROM " + from + " ORDER BY " + order, conn))
{
SqlDataReader dataReader = command.ExecuteReader();
box.Items.Clear();
while (dataReader.Read())
{
box.Items.Add(dataReader[select]);
}
}
}
}
这是另一个:
private void UpdateBox (ListBox box, string select, string from, string order = "")
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
if (order == "") order = select;
using (SqlCommand command = new SqlCommand("SELECT " + select +
" FROM " + from + " ORDER BY " + order, conn))
{
SqlDataReader dataReader = command.ExecuteReader();
box.Items.Clear();
while (dataReader.Read())
{
box.Items.Add(dataReader[select]);
}
}
}
}
两个项目集合都实现了 IList
因此,您可以将 comboBox1.Items 或 listBox1.Items 传递给您的方法,而不是传递 ComboBox/ListBox。
private void UpdateBox (IList items, string select, string from, string order = "")
...
items.Clear();
while (dataReader.Read())
{
items.Add(dataReader[select]);
}
您可以使用@Holger 回答。
对于速度性能,您可以使用重构的:
private void PopulateItems(List<IList> listItems,
string column,
string table,
string orderByColumn = "")
{
using ( var connection = new SqlConnection(connectionString) )
{
connection.Open();
if ( orderByColumn == "" )
orderByColumn = column;
string sql = $"SELECT {column} FROM {table} ORDER BY {orderByColumn}";
using ( var command = new SqlCommand(sql, connection) )
{
var reader = command.ExecuteReader();
foreach ( var items in listItems )
items.Clear();
while ( reader.Read() )
foreach ( var items in listItems )
items.Add(reader[column]);
}
}
}
用法:
var listItemsToPopulate = new List<IList>()
{
comboBox1.Items,
listBox1.Items
};
PopulateLists(listItemsToPopulate, "", "", "");
我会重组这段代码。您试图在 1 个函数中做太多事情。
从操作控件中分离从数据库中获取。现在 GetDbItems 函数是独立的 - 更容易移动到单独的 class 并且不直接绑定到 UI。
像这样:
IList<string> items = GetDbItems("a", "b", "c");
if (items.Any())
{
control.Items.Clear();
control.Items.Add(items);
}
private IList<string> GetDbItems(string select, string from, string order = "")
{
var result = new List<string>();
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
if (order == "") order = select;
using (SqlCommand command = new SqlCommand("SELECT " + select +
" FROM " + from + " ORDER BY " + order, conn))
{
SqlDataReader dataReader = command.ExecuteReader();
while (dataReader.Read())
{
result.Add(dataReader[select]);
}
}
}
return result;
}
- 这只是在编辑框中输入的 - 我不能保证它会编译。我只是想给你一个先机。
下面的过程用数据库中的值填充组合框。
还有一个用于 ListBox 的,完全相同 除了 "box" 是一个 ListBox。
CB 和 LB 类 都有 Items 并且都继承了没有 Items 的 ListControl。
我怎样才能去掉那里的重复代码?
private void UpdateBox (ComboBox box, string select, string from, string order = "")
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
if (order == "") order = select;
using (SqlCommand command = new SqlCommand("SELECT " + select +
" FROM " + from + " ORDER BY " + order, conn))
{
SqlDataReader dataReader = command.ExecuteReader();
box.Items.Clear();
while (dataReader.Read())
{
box.Items.Add(dataReader[select]);
}
}
}
}
这是另一个:
private void UpdateBox (ListBox box, string select, string from, string order = "")
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
if (order == "") order = select;
using (SqlCommand command = new SqlCommand("SELECT " + select +
" FROM " + from + " ORDER BY " + order, conn))
{
SqlDataReader dataReader = command.ExecuteReader();
box.Items.Clear();
while (dataReader.Read())
{
box.Items.Add(dataReader[select]);
}
}
}
}
两个项目集合都实现了 IList
因此,您可以将 comboBox1.Items 或 listBox1.Items 传递给您的方法,而不是传递 ComboBox/ListBox。
private void UpdateBox (IList items, string select, string from, string order = "")
...
items.Clear();
while (dataReader.Read())
{
items.Add(dataReader[select]);
}
您可以使用@Holger 回答。
对于速度性能,您可以使用重构的:
private void PopulateItems(List<IList> listItems,
string column,
string table,
string orderByColumn = "")
{
using ( var connection = new SqlConnection(connectionString) )
{
connection.Open();
if ( orderByColumn == "" )
orderByColumn = column;
string sql = $"SELECT {column} FROM {table} ORDER BY {orderByColumn}";
using ( var command = new SqlCommand(sql, connection) )
{
var reader = command.ExecuteReader();
foreach ( var items in listItems )
items.Clear();
while ( reader.Read() )
foreach ( var items in listItems )
items.Add(reader[column]);
}
}
}
用法:
var listItemsToPopulate = new List<IList>()
{
comboBox1.Items,
listBox1.Items
};
PopulateLists(listItemsToPopulate, "", "", "");
我会重组这段代码。您试图在 1 个函数中做太多事情。
从操作控件中分离从数据库中获取。现在 GetDbItems 函数是独立的 - 更容易移动到单独的 class 并且不直接绑定到 UI。
像这样:
IList<string> items = GetDbItems("a", "b", "c");
if (items.Any())
{
control.Items.Clear();
control.Items.Add(items);
}
private IList<string> GetDbItems(string select, string from, string order = "")
{
var result = new List<string>();
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
if (order == "") order = select;
using (SqlCommand command = new SqlCommand("SELECT " + select +
" FROM " + from + " ORDER BY " + order, conn))
{
SqlDataReader dataReader = command.ExecuteReader();
while (dataReader.Read())
{
result.Add(dataReader[select]);
}
}
}
return result;
}
- 这只是在编辑框中输入的 - 我不能保证它会编译。我只是想给你一个先机。