如何创建一个可以一次填充多个组合框的方法?
Posted
技术标签:
【中文标题】如何创建一个可以一次填充多个组合框的方法?【英文标题】:How to create a method that can fill several comboboxes one at a time? 【发布时间】:2021-07-30 23:35:57 【问题描述】:我正在用 C# 制作一个 Windows 窗体应用程序。在应用程序中,我有一个名为 category page 的页面,其中插入了类别。我想在另一个页面中使用类别。所以我写了一个名为fillCombo()
的方法,它在另一个页面的组合框中生成插入的类别。现在我在该页面中有另一个组合框,我也想要相同的功能。我怎样才能做到这一点?我可以制作一个将在方法中传递的组合框变量吗?这个问题有什么解决办法?
private void fillCombo()
Con.Open();
SqlCommand cmd = new SqlCommand("select CatName from CategoryTbl", Con);
SqlDataReader rdr;
rdr = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Columns.Add("CatName", typeof(string));
dt.Load(rdr);
CatCb.ValueMember = "catName";
CatCb.DataSource = dt;
Con.Close();
【问题讨论】:
【参考方案1】:我们可以像这样将控件作为方法参数传递:
private void FillComboBox(ComboBox combobox)
if ( combobox == null ) return; // Or throw new Exception...
Con.Open();
SqlCommand cmd = new SqlCommand("select CatName from CategoryTbl", Con);
SqlDataReader rdr;
rdr = cmd.ExecuteReader();
DataTable dt = new DataTable();
dt.Columns.Add("CatName", typeof(string));
dt.Load(rdr);
combobox.ValueMember = "catName";
combobox.DataSource = dt;
Con.Close();
我们这样称呼:
FillComboBox(myComboBox);
因此,我们可以根据所提供代码的逻辑填充我们想要的任何组合,拥有自己的 DataSource 到自己的 DataTable。
可能会改进和重构为不执行查询并为每个组合创建一个表:
private const string CategoryColumnName = "CatName";
private DataTable CategoryLookupTable = new DataTable();
private void InitializeCategoryLookupTable()
if ( Connection == null ) return; // Or throw new Exception...
Connection.Open();
try
using ( var command = new SqlCommand("select CatName from CategoryTbl", Connection) )
using ( var reader = command.ExecuteReader() )
CategoryLookupTable.Columns.Add(CategoryColumnName, typeof(string));
CategoryLookupTable.Load(reader);
finally
Connection.Close();
private void FillFromCategoryLookupTable(ComboBox combobox)
if ( combobox == null ) return; // Or throw new Exception...
if ( combobox.DataSource == CategoryLookupTable ) return;
combobox.DataSource = null;
combobox.ValueMember = CategoryColumnName;
combobox.DataSource = CategoryLookupTable;
因此,我们将在某处调用InitializeCategoryLookupTable
(例如在表单加载或显示事件处理程序中),然后再调用FillFromCategoryLookupTable
:
private void MyForm_Load(object sender, EventArgs e)
InitializeCategoryLookupTable();
FillFromCategoryLookupTable(myFirstComboBox);
如果需要不同的源和列名,可以通过将它们作为参数传递来以相同的方式进行重构:
private DataTable CreateLookupTable(string nameTable, string nameColumn)
if ( Connection == null ) return null;
Connection.Open();
try
using ( var command = new SqlCommand($"select nameColumn from nameTable", Connection) )
using ( var reader = command.ExecuteReader() )
var table = new DataTable();
table.Columns.Add(nameColumn, typeof(string));
table.Load(reader);
return table;
finally
Connection.Close();
private void FillFromLookupTable(ComboBox combobox, DataTable table, string column)
...
【讨论】:
以上是关于如何创建一个可以一次填充多个组合框的方法?的主要内容,如果未能解决你的问题,请参考以下文章