#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;
}
}