【问题标题】:Click item in listbox and View details in multiline textbox单击列表框中的项目并在多行文本框中查看详细信息
【发布时间】:2012-03-25 10:19:25
【问题描述】:

我想单击列表框中的一个项目并将传递到该列表框中的属性显示到多行文本框。

下面是我写的表单初始化代码

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() 方法或对其进行正则表达式。我还是一个新手程序员,所以请放轻松:) 谢谢

【问题讨论】:

  • 你的代码在什么方面不起作用?你的实际问题是什么?
  • @Robbie 此代码有效,但这是我用来将内容传递到列表框的代码。我想添加更多内容,以便单击列表框项目,该项目的详细信息将显示在文本框中

标签: c# textbox listbox


【解决方案1】:

您需要为列表框处理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。这是一种广泛使用的约定。

【讨论】:

  • 非常感谢,问题是,我从该代码中收到一条错误消息,提示“对象引用未设置为对象的实例。”那就是“字符串genderOut =(individual.gender ==“M”)?“MALE”:“FEMALE”;”做什么?谢谢!
  • @user1290653 很高兴听到这个消息。如果我发布的内容对您有帮助,请记住接受答案并投票。谢谢
猜你喜欢
  • 2020-02-26
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
相关资源
最近更新 更多