【问题标题】:ComboBox DataBinding does not show value, why?ComboBox DataBinding 不显示值,为什么?
【发布时间】:2011-07-25 20:41:22
【问题描述】:

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

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 来做这个。

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

【问题讨论】:

  • 我也有同样的问题。还没有适合我的解决方案。 :-(

标签: c# data-binding combobox


【解决方案1】:

要确定可能发生的情况:在Grupo 属性设置器中放置一个断点;然后注意在设置 DataSource 时调用的 setter,以便 Grupo 值从存储库加载的值更改(可能为 null)。

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

【讨论】:

  • 在 bindingsource1 CurrentChanged 事件中,如果我得到 BindingSource1.Current,则 Grupo 属性设置正确,但组合框不匹配...我不知道发生了什么...
  • 我尝试了你的建议,但是 Grupo 属性是正确的值,如果我在事件 BindingSource1_CurrentChanged 中放置一个断点,来自 bindingsource1.Current 的值也是正确的,但是组合框不显示该值....谢谢....有什么建议吗?
  • 恐怕那是我在黑暗中刺伤。可惜没用。过去,我在 ComboBox SelectedValue 和 SelectedItem 绑定方面遇到了比平时更难的时间 - 主要是在更改或更新数据源后管理 SelectedIndex。
【解决方案2】:

指定更新模式为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));

【讨论】:

  • 我按照你告诉我的方法试过了,但是……没有用……我很害怕,我的组合框出了什么问题?
【解决方案3】:

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

我用过类似的东西

comboBox.SelectedItem = comboBox.Items
                                .Cast<Usuario>()
                                .FirstOrDefault(u => u.IdGrupo.Equals(usuario.Grupo.IdGrupo));

【讨论】:

    【解决方案4】:
    BindingSource1.DataSource = Usuariolst;
    ComboBox1.DataSource = Grupolst;
    ComboBox1.DisplayMember = "Descricao";
    // This will do the trick
    ComboBox1.ValueMember = "IdGrupo";
    

    【讨论】:

    • 如果要向 ComboBox 显示来自数据源的当前值,则需要设置属性 ValueMember
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    相关资源
    最近更新 更多