我有一个具有以下结构的类:
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来做到这一点。
组合框数据绑定似乎链接正确,因此没有显示正确的值
要确定可能发生的事情:在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";