У меня есть элемент tabcontrol с несколькими вкладками. На вкладке 2 (индекс 1) у меня есть выпадающий список, который управляет выбором шаблона. Сам шаблонный объект содержит идентификатор и имя
internal class Template
{
public Template(double id, string name)
{
ID = id;
Name = name;
}
public double ID { get; private set; }
public string Name { get; private set; }
}
С помощью этого комбинированного списка я хочу отобразить имя и выбрать идентификатор. Я приведу полный рабочий пример.
Моя форма
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
cmbx = new Cmbx(comboBox1); // pass in the combobox element
}
private Cmbx cmbx; // My combobox class
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
if (tabControl1.SelectedIndex == 1) // tab 2 active?
{
cmbx.CreateTemplateSelection(myTemplates); // init combobox with the templates list
}
}
private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
// handle the new selected ID here
MessageBox.Show($"Combobox Change Event - Selected ID {cmbx.SelectedTemplateID}");
}
}
и мой класс со списком
class Cmbx
{
public Cmbx(ComboBox cmbx)
{
this.cmbx = cmbx;
}
private ComboBox cmbx; // GUI element
private Template[] currentTemplates;
public double SelectedTemplateID // Get the current selected value
{
get
{
Template templateInfo = cmbx.SelectedValue as Template;
return templateInfo.ID;
}
}
public void CreateTemplateSelection(Template[] templates) // populate the combobox
{
if (currentTemplates != null) // first time?
{
if (currentTemplates.SequenceEqual(templates)) // different data?
{
return; // nothing changed -> return
}
}
// different data
cmbx.DataSource = null; // clear the combobox
cmbx.Items.Clear();
BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = templates;
cmbx.DataSource = bindingSource.DataSource; // setup the data
cmbx.DisplayMember = nameof(Template.Name); // display the template name
cmbx.ValueMember = nameof(Template.ID); // select the template id
bool valid = templates.Length > 0; // existing data?
if (valid && cmbx.SelectedIndex != 0)
cmbx.SelectedIndex = 0; // select the first item
currentTemplates = templates; // assign the new templates to the current ones
}
}
При запуске проекта и выборе второй вкладки comboBox1_SelectedValueChanged
срабатывает 3 раза.
При первом и втором запуске cmbx.SelectedTemplateID
возвращает мне выбранный идентификатор шаблона 1. Это правильно.
Третий прогон возвращает мне нулевой указатель.
Почему он срабатывает 3 раза? И почему третий вызов события возвращает нулевой указатель?