Combobox中的DisplayMember无法正常工作

时间:2015-09-18 17:48:43

标签: c# .net winforms

我有这种方法可以将Conta个实例添加到名为" comboContas"的ComboBox中:

public void AdicionaConta(Conta novaConta)
{
    comboContas.Items.Add(novaConta);
    comboContas.DisplayMember = "Titular";
}

请注意,我已将DisplayMember属性设置为" Titular"。这是我的Conta课程:

public abstract class Conta
{
    public int Numero { get; set; }

    public double Saldo { get; set; }

    public Cliente Titular { get; set; }

    public override string ToString()
    {
        return "titular: " + this.Titular.Nome;
    }       
}

现在," Titular"属于Cliente类型。 这是Cliente课程:

public class Cliente
{
    public string Nome { get; set; }
    public string Rg { get; set; }

    public Cliente(string nome)
    {
        this.Nome = nome;
    }

    public override string ToString()
    {
        return "ToString do Cliente: " + this.Nome;
    }
}

我想在" comboContas"中展示什么? ComboBox就像" ToString做Cliente:Gabriel"。 但是,ToString类的Cliente方法未被调用。相反,被调用者来自Conta类。

enter image description here

这是非常简单的事情,我真的不知道发生了什么。如果我将DisplayMember更改为任何其他属性,则可以。如果我改变" Titular"的类型对于任何其他类型的属性,将调用此另一种类型的ToString()。它只是不适用于Cliente

2 个答案:

答案 0 :(得分:3)

您的代码有问题(在每次添加之后而不是提前设置它?)因为它确实按预期工作。看看:

using System;
using System.Windows.Forms;

namespace Tests
{
    public class Conta
    {
        public int Numero { get; set; }
        public double Saldo { get; set; }
        public Cliente Titular { get; set; }
        public override string ToString()
        {
            return "titular: " + this.Titular.Nome;
        }
    }
    public class Cliente
    {
        public string Nome { get; set; }
        public string Rg { get; set; }
        public Cliente(string nome)
        {
            this.Nome = nome;
        }
        public override string ToString()
        {
            return "ToString do Cliente: " + this.Nome;
        }
    }
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            var form = new Form { Padding = new Padding(16) };
            var comboBox = new ComboBox { Dock = DockStyle.Top, Parent = form };
            comboBox.DisplayMember = "Titular";
            comboBox.Items.AddRange( new []
            {
                new Conta { Titular = new Cliente("Victor") },
                new Conta { Titular = new Cliente("Mauricio") },
                new Conta { Titular = new Cliente("csni") },
            });
            Application.Run(form);
        }
    }
}

结果:

enter image description here

答案 1 :(得分:0)

我不是百分之百确定你为什么做的不起作用,但一种可能有用的方法就是做这样的事情:

public class Client
{
    public string DisplayName { get { return "ToString do Client: " + this.Nome; } }
}

然后,只需更改组合框以将DisplayMember绑定到DisplayName:

public void AdicionaConta(Conta novaConta)
{
    comboContas.Items.Add(novaConta);
    comboContas.DisplayMember = "Titular.DisplayName";
}

我希望这有帮助!