Добавить строку в комбинированный список WinForms после заполнения ее из таблицы данных - PullRequest
0 голосов
/ 18 марта 2020

Я заполняю комбинированный список из таблицы данных следующим кодом:

public void PopulateCategoryCbo()
{
    string connString = string.Format(<connectionString>);
    NpgsqlConnection conn = new NpgsqlConnection(connString);
    conn.Open();

    string query = "SELECT id, category FROM categories ORDER BY category";
    NpgsqlCommand cmd = new NpgsqlCommand(query, conn);

    NpgsqlDataReader reader;
    reader = cmd.ExecuteReader();

    DataTable dt = new DataTable();
    //DataRow row = dt.NewRow();
    //row["id"] = 0;
    //row["category"] = "All Categories";
    //dt.Rows.InsertAt(row, 0);

    dt.Columns.Add("id", typeof(string));
    dt.Columns.Add("category", typeof(string));
    dt.Load(reader);

    cboSelectCategory.ValueMember = "id";
    cboSelectCategory.DisplayMember = "category";
    cboSelectCategory.DataSource = dt;

    conn.Close();
}

Четыре закомментированные строки - моя попытка добавить в начало таблицы «Все категории» строку с индексом 0. Я сделал этот код для этого SO вопроса и ответа .

Однако, когда я запускаю решение, оно разрывается в строке row["id"] = 0; с сообщением, идентификатор «Столбец» "не принадлежит таблице. '

Я попытался использовать 0 и 1, подумав, что они будут ссылаться на значение индекса столбцов, но я получил сообщение« Столбец 0 не принадлежит таблице. »

Я не понимаю, почему это не работает. Я вижу много похожих решений, когда решаю эту проблему в Google.

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Не ответ на оригинальный вопрос, но с подходом ниже вы устраните основную проблему.

Для источника данных в выпадающем списке вам не нужен тяжелый DataTable, вместо этого используйте простые c# объекты

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Затем загрузите данные из базы данных в список Category объектов

private List<Category> LoadCategories()
{
    var query = "SELECT id, category FROM categories ORDER BY category";
    using (var connection = new NpgsqlConnection(connString))
    using (var command = new NpgsqlCommand(query, connection))
    {
        conn.Open();
        var categories = new List<Category>();
        using (var reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                var category = new Category()
                {
                    Id = reader.GetInt32(0),
                    Name = reader.GetString(1)
                }
                categories.Add(category);
            }
        }

        return categories;
    }
}

Тогда использование становится очень простым

var categories = LoadCategories();

var all = new Category { Id = 0, Name = "All Categories" };
categories.Insert(0, all);

cboSelectCategory.ValueMember = "Id";
cboSelectCategory.DisplayMember = "Name";
cboSelectCategory.DataSource = categories;
0 голосов
/ 18 марта 2020

Вы добавляете в dt строку, которая является новой таблицей данных без столбцов. Если вы хотите заполнить таблицу данных, посмотрите на DbDataAdapter.Fill вместо DbDataReader. Заполните таблицу данных, а затем добавьте строку.

...