Как сделать только один метод для заполнения элементов ComBobox, а также ListBox? - PullRequest
1 голос
/ 05 ноября 2019

Эта процедура ниже заполняет ComboBox значениями из базы данных.

Существует также один для ListBoxes, и он полностью идентичен , за исключением того, что "box" является ListBox.

Оба класса CB и LB имеют Items и оба наследуют ListControl, в котором нет Items.

Как мне избавиться от дублирующегося кода там?

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

Ответы [ 3 ]

1 голос
/ 05 ноября 2019

Обе коллекции предметов реализуют IList

Таким образом, вместо передачи ComboBox / ListBox, вы можете просто передать comboBox1.Items или listBox1.Items вашему методу.

 private void UpdateBox (IList items, string select, string from, string order = "")

...

 items.Clear();
 while (dataReader.Read())
 {
     items.Add(dataReader[select]);
 }
0 голосов
/ 05 ноября 2019

Я бы реструктурировал этот код. Вы пытаетесь сделать слишком много в 1 функции.

Разделение выборки из БД при манипулировании элементом управления. Теперь функция GetDbItems является независимой - ее проще перемещать в отдельный класс и не привязывать непосредственно к интерфейсу пользователя.

Что-то вроде этого:

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;
    }
  • Это было просто введено вокно редактирования - я не могу гарантировать, что оно скомпилируется. Я просто хотел дать вам преимущество.
0 голосов
/ 05 ноября 2019

Вы можете использовать ответ @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, "", "", "");
...