Добавление строк в таблицу данных и использование элемента отображения поля со списком?

#c#

#c#

Вопрос:

По сути, у меня есть представление сетки данных с 4 столбцами и множеством строк. Сверху у меня есть поле со списком с категориями на выбор, и в зависимости от этого выбранного элемента изменяется представление сетки данных.

Проблема в том, что при добавлении строк я снова добавляю одни и те же строки (например, Базовые фразы), и в поле со списком отображаются одни и те же строки (поэтому, если есть 4 слова, принадлежащих базовым фразам, поле со списком отображает базовые фразы 4 раза). Я приложу свой код для лучшего ознакомления.

Есть ли лучший способ сделать это, возможно, с помощью массива? Спасибо.

 public dgvWordSets()
        {
            InitializeComponent();


            table = new DataTable ("Words");
            table.Columns.Add("English", typeof(string));
            table.Columns.Add("French", typeof(string));
            table.Columns.Add("Italian", typeof(string));
            table.Columns.Add("WordSets", typeof(string));


            table.Rows.Add("Hello", "Salut", "Salve", "Basic Phrases");
            table.Rows.Add("Good night", "Bonne nuit", "Buonanotte", "Basic Phrases");
            table.Rows.Add("Good evening", "Bonsoir", "Buonasera", "Basic Phrases");
            table.Rows.Add("Excuse me", "Excusez-moi", "Scusa", "Basic Phrases");
            table.Rows.Add("Please", "S'il vous plait", "Per favore", "Basic Phrases");
            table.Rows.Add("Dog", " Le chien", "Il cane", "Animals");
            table.Rows.Add("Cat", "Le chat", "Il gatto", "Animals");
            table.Rows.Add("Jacket", "Un veste", "La giacca", "Clothes");

            comboBox1.DataSource = table.DefaultView;
            comboBox1.DisplayMember = "WordSets";
}

  private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

                if (comboBox1.SelectedIndex > -1)
                {
                    DataRowView view = comboBox1.SelectedItem as DataRowView;
                    string WordSets = view["WordSets"].ToString();

                    DataRow[] rows = table.Select("WordSets = '"   WordSets   "'");
                    DataTable newTable = table.Clone();
                    foreach (DataRow row in rows)
                        newTable.ImportRow(row);
                    dataGridView1.DataSource = newTable.DefaultView;
                }

 

Комментарии:

1. Ну, ваш DisplayMember — это «Наборы слов», поэтому он будет отображать основные фразы в каждом элементе списка. Вам нужен другой элемент отображения, такой как «Английский», который будет отображать все английские слова.

2. Я просто хочу показать категории, например, «Основные фразы», «Животные» «Clothes…in поле со списком … и там будет 52 для каждого, отображаемого в таблице

Ответ №1:

Combox не должен иметь в качестве источника данных всю таблицу, а только отдельные значения таблицы

 List<string>wordsets = table.AsEnumerable().Select(x => x.Field<string>("WordSets")).Distinct().ToList();
comboBox1.DataSource = wordsets;
dataGridView1.DataSource = table.DefaultView;
 

Теперь, когда вы выбираете что-то из списка, вам не нужно создавать отдельную таблицу данных, но вы можете просто установить DefaultView.Фильтр строк для табличной переменной

 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    if (comboBox1.SelectedIndex > -1)
    {
        string word = comboBox1.SelectedItem.ToString();
        table.DefaultView.RowFilter = "WordSets = '"   word   "'";
        dataGridView1.DataSource = table.DefaultView;
    }
}