如何创建一个可以一次填充多个组合框的方法?

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)

  ...

【讨论】:

以上是关于如何创建一个可以一次填充多个组合框的方法?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中填充组合框的最快方法是啥? [关闭]

尝试根据另一个组合框的选择填充两个组合框

如何过滤表单中具有多个组合框的 Access 子表单?

如何在不使用 datagridview 的情况下编辑绑定到组合框的数据表中的数据?

如何清除剑道组合框的值

如何设置默认组合框