Выборка comboBox + проверка
форумчане! Есть CSV файл, который содержит 1000+ строк, имеет формат:
CPU_name,Socket
i7-7740X OEM,LGA 2066
Xeon W-2123,LGA 2066
Xeon W-2125,LGA 2066
Xeon W-2133,LGA 2066
Xeon W-2135,LGA 2066
i7-4820K BOX,LGA 2011
i7-4820K OEM,LGA 2011
Xeon E5-1620 v2,LGA 2011
Также есть comboBox12, который содержит в себе Сокеты, и есть comboBox13, который при выборе в comboBox12, допустим, сокета LGA 2011, должен содержать только список такой:
i7-4820K BOX
i7-4820K OEM
Xeon E5-1620 v2
Еще процессоры, которые идут в CSV. (такой же формат)
Есть код, который отделяет Socket'ы от CPU_name, но не могу придумать, как легко, в несколько строк, сделать так, чтобы при выборе сокет 2011, к примеру, выпадал список только из CPU_Name с этим сокетом.
Код при инициализации формы:
List<SOCKETintel> socksintel = SOCKETsIntel.GetSOCKETintelValues();
foreach (SOCKETintel sock in socksintel)
{
if (!comboBox12.Items.Contains(sock.Socketintel))
{
comboBox12.Items.Add(sock.Socketintel);
}
comboBox13.Items.Add(sock.CPU_Name);
if (comboBox13.Items.Contains(sock.Socketintel))
{
comboBox13.Items.Add(sock.CPU_Name);
}
Код для парсинга и считывания CSV:
public static class SOCKETsIntel
{
public static List<SOCKETintel> GetSOCKETintelValues()
{
string filePath = Path.Combine(GetPath + @"\INTEL_CPU\", "INTEL.csv"); // Sdelat' Proverky na nazvanie File;
using (var reader = new StreamReader(filePath))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
var socksintel = new List<SOCKETintel>();
csv.Read();
csv.ReadHeader();
while (csv.Read())
{
var sock = new SOCKETintel
{
CPU_Name = csv.GetField<string>("CPU_name"),
Socketintel = csv.GetField<string>("Socket")
};
socksintel.Add(sock);
}
return socksintel;
}
}
}
// Sozdanie classa dlya parsinga Type/Brand/Model/Benchmark'a CPU;
public class SOCKETintel
{
public string CPU_Name { get; set; }
public string Socketintel { get; set; }
}
Ответы (1 шт):
Автор решения: Bulson
→ Ссылка
public partial class Form1 : Form
{
private const string _socketAll = "Любой";
//источники данных для комбобоксов
private BindingSource _bsSockets;
private BindingSource _bsCpus;
//данные
private List<SOCKETintel> _records;
public Form1()
{
InitializeComponent();
//привязка у комбобокса сокетов
_bsSockets = new BindingSource();
_bsSockets.DataSource = typeof(List<String>);
_comboBoxSockets.DataSource = _bsSockets;
//привязка у комбобокса процессоров
_bsCpus = new BindingSource();
_bsCpus.DataSource = typeof(List<SOCKETintel>);
_comboBoxCpus.DataSource = _bsCpus;
_comboBoxCpus.DisplayMember = nameof(SOCKETintel.CPU_Name);
this.Load += Form1_Load;
}
private void Form1_Load(object sender, EventArgs e)
{
//получаем данные
_records = DataContext.GetRecords();
//заполняем комбобокс сокетов
_bsSockets.Add(_socketAll);
_records.Select(r => r.Socketintel)
.Distinct()
.ToList()
.ForEach(s => _bsSockets.Add(s));
//заполняем комбобокс процессоров
UpdateComboBoxCpus(_socketAll);
//подписка на событие выбора в комбобоксе сокетов
_bsSockets.CurrentChanged += (s, a) => UpdateComboBoxCpus(_bsSockets.Current as String);
}
private void UpdateComboBoxCpus(string selectedValue)
{
_bsCpus.Clear();
if (selectedValue.Equals(_socketAll))
{
//полный список
_records.ForEach(r => _bsCpus.Add(r));
}
else
{
//список с выборкой по сокету
_records.Where(r => r.Socketintel.Equals(selectedValue))
.ToList()
.ForEach(r => _bsCpus.Add(r));
}
}
}
