ComboBox数据绑定不显示值,为什么?

本文关键字:为什么 显示 数据绑定 ComboBox | 更新日期: 2023-09-27 18:03:43

我有一个具有以下结构的类:

public class Grupo
{
    public virtual int IdGrupo { get; private set; }
    public virtual string Descricao { get; set; }
}
public class Usuario
{
    public virtual int IdUsuario { get; private set; }
    public virtual Grupo Grupo { get; set; }
    public virtual string Login { get; set; }
    public virtual string Senha { get; set; }
    public virtual bool Administrador { get; set; }
}

我有一个类,实现了一些方法来填充BindingList:

BindingList<Usuario> Usuariolst = UsuarioRepository.GetAll();
BindingList<Grupo> Grupolst = GrupoRepository.GetAll();

在我的Form1中,我有一个名为ComboBox1的ComboBox和一个名为= BindingSource1的BindingSource,在填充bindinglists之后,我可以用列表设置ComboBox:

BindingSource1.DataSource = Usuariolst;
ComboBox1.DataSource = Grupolst;
ComboBox1.DisplayMember = "Descricao";
ComboBox1.DataBindings.Add(new System.Windows.Forms.Binding("SelectedValue", this.BindingSource1, "Grupo", true));

所有CRUD工作得很好,问题是当我加载Usuariolst并设置BindingSource1的当前位置时,组合框不显示相关的正确值,但是当我保存正确的值设置时,我使用nhibernate来做到这一点。

组合框数据绑定似乎链接正确,因此没有显示正确的值

ComboBox数据绑定不显示值,为什么?

要确定可能发生的事情:在Grupo属性setter中设置一个断点;然后观察在设置DataSource时调用的setter,这样Grupo的值就会从存储库加载的值更改(可能为null)。

如果是这种情况,请尝试在添加绑定后设置组合框数据源。

指定OnPropertyChanged的更新方式:

ComboBox1.DataBindings.Add(new System.Windows.Forms.Binding("SelectedValue", 
    this.BindingSource1, "Grupo", true, DataSourceUpdateMode.OnPropertyChanged));

编辑:尝试用Usuariolst替换this.BindigSource1:

ComboBox1.DataBindings.Add(new System.Windows.Forms.Binding("SelectedValue", 
    Usuariolst, "Grupo", true, DataSourceUpdateMode.OnPropertyChanged));

我遇到了同样的问题,我发现唯一的解决方案是忽略数据绑定并手动实现相同的功能,使用Combobox.SelectionChangeCommitted事件注册对组合框的更改,并使用Combobox.SelectedItem初始设置项。

我用的是

comboBox.SelectedItem = comboBox.Items
                                .Cast<Usuario>()
                                .FirstOrDefault(u => u.IdGrupo.Equals(usuario.Grupo.IdGrupo));
BindingSource1.DataSource = Usuariolst;
ComboBox1.DataSource = Grupolst;
ComboBox1.DisplayMember = "Descricao";
// This will do the trick
ComboBox1.ValueMember = "IdGrupo";