如何列出列表框中的类列表?

时间:2017-12-03 18:12:17

标签: c# list listbox

我想在列表框中列出包含个人姓名的列表。应使用文本框添加名称,我使用类名称保存等。

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

班级代码

 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;
    }
}
提前谢谢。

2 个答案:

答案 0 :(得分:0)

您在uitkomsten本地声明变量button1_Click。此变量仅在执行方法时存在。要在表单的整个生命周期中使其生效,请将其声明为表单类的字段(并从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<Persoon>,则可以直接将人员添加到列表中。列表框会自动使用.ToString()来显示对象。

uitkomsten.Add(nieuwbmi);

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

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

同时在double的构造函数中将权重和长度参数更改为Persoon。对于这些测量,您在其他地方都会翻倍。如果使用自动实现的属性,则会简化类

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;
    }
}

答案 1 :(得分:0)

    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);
    }