【问题标题】:How to list a list of classes in a listbox?如何在列表框中列出类列表?
【发布时间】:2017-12-03 18:12:16
【问题描述】:

我想在一个列表框中制作一个包含人名的列表。应该使用文本框添加名称,并且我正在使用一个类来保存名称等。

如何显示将信息添加到列表框的人的姓名,并且仅在单击/按下列表时将信息显示到富文本框?

类代码

 class Persoon
{
    private string naam;
    private string geslacht;
    private double gewicht;
    private double lengte;
    public double bmi;


    public string Naam
    {
        get { return naam; }
        set { naam = value; }
    }
    public string Geslacht
    {
        get { return geslacht; }
        set { geslacht = value; }
    }
    public double Gewicht
    {
        get { return gewicht; }
        set { gewicht = value; }
    }
    public double Lengte
    {
        get { return lengte; }
        set { lengte = value; }
    }
    public double Bmi
    {
        get { return bmi; }
        set { bmi = value; }
    }

    public object Convert { get; internal set; }

    public Persoon(string nm, string gt, int wt, int le)
    {
        naam = nm;
        geslacht = gt;
        gewicht = wt;
        lengte = le;
    }

    public double BMI()
    {
        double bmiuitkomst = gewicht / Math.Pow(lengte / 100.0, 2);
        return bmiuitkomst;

    }
    public override string ToString()
    {
        return "Persoon: " + Naam + " " + Geslacht;
    }

表单代码

 public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string naam = tb_naam.Text;
        string geslacht = tb_geslacht.Text;
        double gewicht = Convert.ToDouble(tb_gewicht.Text);
        double lengte = Convert.ToDouble(tb_lengte.Text);
        double bmiuitkomst = gewicht / Math.Pow(lengte / 100.0, 2);



        Persoon nieuwbmi = new Persoon(naam, geslacht, Convert.ToInt32(gewicht), Convert.ToInt32(lengte));
        rtb_uitkomst.Text = "Naam: "+ naam + Environment.NewLine + "Geslacht: " + geslacht + Environment.NewLine + "BMI: " +   Convert.ToString(bmiuitkomst);
        // rtb_uitkomst.Text = nieuwbmi.ToString();

        List<string> uitkomsten = new List<string>();
        foreach (var item in uitkomsten)

        {
            uitkomsten.Add(Convert.ToString(nieuwbmi));
        }
        // lb_list.(Convert.ToString(nieuwbmi));
        lb_list.DataSource = uitkomsten;
    }
}

提前致谢。

【问题讨论】:

  • List&lt;string&gt; uitkomsten = new List&lt;string&gt;(); foreach (var item in uitkomsten) { uitkomsten.Add(Convert.ToString(nieuwbmi)); } 有什么用?您创建一个空列表,然后尝试循环
  • @Z.R.T.回头看,我不知道我在那里试图做什么。我想在列表框中创建一个显示人员姓名的列表,然后当我单击姓名时,该特定人员的信息应显示在富文本框中。
  • @Z.R.T.部分修复它,代码现在在列表框中显示名称,但也在富文本框中。我如何确保它只在选择名称时(在列表框中)显示富文本框中的信息?另外,如何在列表框中添加多行?每个新名称都应添加到之前添加的名称下。
  • “我如何确保它只在选择名称时(在列表框中)显示富文本框中的信息”控制该行为认为列表框的 SelectedIndexChanged 事件

标签: c# list listbox


【解决方案1】:

您在 button1_Click 中本地声明一个变量 uitkomsten。该变量仅在方法执行时存在。为了让它在表单的整个生命周期中生效,请将其声明为表单类的字段(并从 button1_Click 方法中删除声明)

public partial class Form1 : Form

    private List<string> uitkomsten = new List<string>();

    public Form1()
    {
        InitializeComponent();
    }

    ...
}

然后你尝试添加一个人

foreach (var item in uitkomsten)
{
    uitkomsten.Add(Convert.ToString(nieuwbmi));
}

这行不通。 foreach 循环循环的次数与uitkomsten 列表中的元素一样多。但由于列表一开始是空的,Add 方法将永远不会被执行。删除循环。

uitkomsten.Add(Convert.ToString(nieuwbmi));

请注意,如果您有 List&lt;Persoon&gt;,您可以直接将人员添加到列表中。列表框自动使用.ToString() 来显示对象。

uitkomsten.Add(nieuwbmi);

另一个问题是lb_list.DataSource = uitkomsten; 总是分配相同的列表。由于列表框的实现方式,它不会注意到任何差异,因此不会显示添加的新人员。要解决此问题,请先分配null

lb_list.DataSource = null;
lb_list.DataSource = uitkomsten;

同样在Persoon的构造函数中将权重和长度参数改为double。对于这些测量,您在其他任何地方都有双打。如果你使用自动实现的属性,这会简化类

class Persoon
{
    public string Naam { get; set; }
    public string Geslacht { get; set; }
    public double Gewicht { get; set; }
    public double Lengte { get; set; }
    public double Bmi { get; set; }

    public Persoon(string nm, string gt, double wt, double le)
    {
        Naam = nm;
        Geslacht = gt;
        Gewicht = wt;
        Lengte = le;
    }

    public double BMI()
    {
        return Gewicht / Math.Pow(Lengte / 100.0, 2);

    }
    public override string ToString()
    {
        return $"Persoon: {Naam} {Geslacht}";
    }
}

然后表格变成(加上一些额外的调整)

public partial class Form1 : Form
{
    private List<Persoon> uitkomsten = new List<Persoon>();

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        string naam = tb_naam.Text;
        string geslacht = tb_geslacht.Text;
        double gewicht = Convert.ToDouble(tb_gewicht.Text);
        double lengte = Convert.ToDouble(tb_lengte.Text);

        Persoon nieuwbmi = new Persoon(naam, geslacht, gewicht, lengte);
        rtb_uitkomst.Text = $"Naam: {naam}\r\nGeslacht: {geslacht}\r\nBMI: {nieuwbmi.BMI()}";
        uitkomsten.Add(nieuwbmi);
        lb_list.DataSource = null;
        lb_list.DataSource = uitkomsten;
    }
}

【讨论】:

    【解决方案2】:
        private List<string> uitkomsten = new List<string>();
        private BindingSource bs = new BindingSource();
        public MainForm()
        {
            InitializeComponent();
            bs.DataSource = uitkomsten;
            lb_list.DataSource = bs;
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            ......
            uitkomsten.Add(Convert.ToString(nieuwbmi));
            bs.ResetBindings(false);
        }
    

    选择名称时(在列表框中)?

    时,如何确保它仅在RichTextbox中显示信息
        private void lb_list_SelectedIndexChanged(object sender, EventArgs e)
        {
            Persoon nieuwbmi = ((Persoon)lb_list.SelectedItem).Name1;
            rtb_uitkomst.Text = "Naam: " + naam + Environment.NewLine + "Geslacht: " + geslacht + Environment.NewLine + "BMI: " + Convert.ToString(bmiuitkomst);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      • 2019-10-31
      • 2021-04-02
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      相关资源
      最近更新 更多