我有一个具有以下结构的类:
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,在填充绑定列表之后,我可以将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来做此
组合框数据绑定似乎正确链接,因此未显示正确的值。
答案 0 :(得分:0)
将更新模式指定为OnPropertyChanged
:
ComboBox1.DataBindings.Add(new System.Windows.Forms.Binding("SelectedValue",
this.BindingSource1, "Grupo", true, DataSourceUpdateMode.OnPropertyChanged));
修改:尝试将this.BindigSource1
替换为Usuariolst
:
ComboBox1.DataBindings.Add(new System.Windows.Forms.Binding("SelectedValue",
Usuariolst, "Grupo", true, DataSourceUpdateMode.OnPropertyChanged));
答案 1 :(得分:0)
确定可能发生的事情:在Grupo
属性设置器中放置一个断点;然后注意在设置DataSource
时调用的setter,以便Grupo
值从存储库中加载的值(可能为null)更改。
如果是这种情况,请在添加绑定后尝试设置组合框DataSource。
答案 2 :(得分:0)
我遇到了同样的问题,我发现唯一的解决方案是忽略数据绑定并手动实现相同的功能,使用Combobox.SelectionChangeCommitted
事件将更改注册到组合框,并使用Combobox.SelectedItem
设置项目最初。
我用过类似的东西
comboBox.SelectedItem = comboBox.Items
.Cast<Usuario>()
.FirstOrDefault(u => u.IdGrupo.Equals(usuario.Grupo.IdGrupo));
答案 3 :(得分:-1)
BindingSource1.DataSource = Usuariolst;
ComboBox1.DataSource = Grupolst;
ComboBox1.DisplayMember = "Descricao";
// This will do the trick
ComboBox1.ValueMember = "IdGrupo";