Вам необходимо обработать событие SelectedIndexChanged
для вашего списка.
Один из способов сделать это - вызвать Form1.cs [Design] и выбрать список.В сетке свойств (Alt + Enter) щелкните значок, который выглядит следующим образом:
Найдите событие SelectedIndexChanged
и дважды щелкните его.Это соединит вас с обработчиком событий в автоматически сгенерированном файле Form1.cs.designer.
Затем замените код для вашего класса Form1 следующим:
public partial class Form1 : Form
{
private Dictionary<int, Individual> _individuals;
public Form1()
{
InitializeComponent();
ReadFromFile.Read("sample.GED");
_individuals = ReadFromFile.individuals;
listBox1.DataSource = _individuals.Select(individual => individual.Value).ToList();
listBox1.DisplayMember = "name";
listBox1.ValueMember = "id";
}
private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
{
textBox1.Clear();
var individual = listBox1.SelectedItem as Individual;
string genderOut = (individual.Gender == "M") ? "MALE" : "FEMALE";
var displayText
= String.Format("Name = {0} {1}\r\n" +
"Gender = {2}\r\n" +
"Birth date = {3}\r\n" +
"Birth place = {4}\r\n" +
"Death date = {5}\r\n" +
"Death place = {6}"
, individual.name.givenName
, individual.name.surname
, genderOut
, individual.birth.date
, individual.birth.place
, individual.death.date
, individual.death.place);
textBox1.AppendText(displayText);
}
}
Несколькозаметки о некоторых вещах, которые я изменил.
- Я переместил код, который устанавливал значение текстового поля, в обработчик событий
SelectedIndexChanged
- Я рефакторил этокод, чтобы сделать его более читабельным, используя статический метод String.Format (все те повторы
Environment.NewLine
, которые у вас были, были грязными). - Вместо этого я настроил данные для поля списка, используя свойство
DataSource
вашего цикла foreach.
Кроме того, одна вещь, которую вы заметите, это то, что элементы списка в списке не будут отображать правильный текст.Это потому, что вы, кажется, используете некоторые пользовательские классы или структуры для имени, рождения и смерти человека?Чтобы это исправить, вам нужно добавить новое свойство в класс Individual
следующим образом:
public class Individual
{
// ... your code
public string DisplayName
{
get { return String.Format("{0} {1}), name.givenName, name.surname; }
}
// ... the rest of your code
}
Затем вам нужно изменить строку в моем коде выше, которая выглядит следующим образом:
listBox1.DisplayMember = "name";
к этому:
listBox1.DisplayMember = "DisplayName";
Последнее замечание: вам, вероятно, следует использовать «Верхний верблюжий чемодан» в качестве названия вашей собственности.Это означает, что они начинаются с заглавной буквы, а затем первая буква каждого слова также является заглавной.Например, name.givenName
должно быть Name.GivenName
.Это широко используемая конвенция.