Щелкните элемент в списке и просмотрите детали в многострочном текстовом поле. - PullRequest
1 голос
/ 25 марта 2012

Я хотел бы нажать на элемент в списке и отобразить атрибуты, которые были переданы в этот список в многострочное текстовое поле.

Ниже приведен код, который я написал при инициализации формы

public Form1()
    {
        InitializeComponent();
        ReadFromFile.Read("sample.GED");

        foreach (KeyValuePair<int, Individual> kvp in ReadFromFile.individuals)
        {
            listBox2.Items.Add("ID = " + kvp.Value.id + " Name = " + kvp.Value.name.givenName + " " + kvp.Value.name.surname + " DoB = " + kvp.Value.birth.date);
        }

        int testIndividual = 94;

        string genderOut = "";
        if (ReadFromFile.individuals[testIndividual].gender == "M")
        {
            genderOut = "MALE";
        }
        else if (ReadFromFile.individuals[testIndividual].gender == "F")
        {
            genderOut = "FEMALE";
        }

        try
        {
            textBox1.AppendText(
                "Name = " + ReadFromFile.individuals[testIndividual].name.givenName + " "
                + ReadFromFile.individuals[testIndividual].name.surname
                + Environment.NewLine + "Gender = " + genderOut
                + Environment.NewLine + "Birth date = " + ReadFromFile.individuals[testIndividual].birth.date
                + Environment.NewLine + "Birth place = " + ReadFromFile.individuals[testIndividual].birth.place
                + Environment.NewLine + "Death date = " + ReadFromFile.individuals[testIndividual].death.date
                + Environment.NewLine + "Death place = " + ReadFromFile.individuals[testIndividual].death.place);
        }
        catch
        {
            MessageBox.Show("This individual doesnt exist");
        }
    }
}

Я хотел бы добавить больше, чтобы я мог щелкнуть элемент списка, и детали этого элемента будут отображены в текстовом поле

У меня такое чувство, что может потребоваться переопределить метод ToString ()или regex это.Я все еще начинающий программист, так что будьте осторожны со мной :) СПАСИБО

1 Ответ

0 голосов
/ 25 марта 2012

Вам необходимо обработать событие SelectedIndexChanged для вашего списка.

Один из способов сделать это - вызвать Form1.cs [Design] и выбрать список.В сетке свойств (Alt + Enter) щелкните значок, который выглядит следующим образом:

Events Icon

Найдите событие 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.Это широко используемая конвенция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...