【问题标题】:Winforms comboBox databinding whole object (no dataMember)Winforms 组合框数据绑定整个对象(无 dataMember)
【发布时间】:2016-05-01 11:09:03
【问题描述】:

我很难将简单对象绑定到组合框,如下所示:

public partial class Planning : Form
{
    private static BindingList<VisiteVisiteur> visiteurs = new BindingList<VisiteVisiteur>(Program.model.VisiteVisiteur.ToList());
    public VisiteVisiteur visiteur = visiteurs.Last();

    public Planning()
    {
        InitializeComponent();

        comboBox1.DataSource = visiteurs;
        comboBox1.DisplayMember = "Name";
        comboBox1.DataBindings.Add("SelectedValue", visiteur, "", true, DataSourceUpdateMode.OnPropertyChanged);

我想绑定到整个 visiteur 对象,以便它随着组合框 selectedValue 的变化而更新。 目前, selectedValue 发生变化,但访问者对象没有变化。我在这里做错了什么?

解决方案: 使用 SelectedIndexChanged 事件更新 visiteur 变量

public partial class Planning : Form
{
    private static BindingList<VisiteVisiteur> visiteurs = new BindingList<VisiteVisiteur>(Program.model.VisiteVisiteur.ToList());
    public VisiteVisiteur visiteur = null;

    public Planning()
    {
        InitializeComponent();

        VisiteVisiteur visiteurTemp = visiteurs.Last();

        comboBox1.SelectedIndexChanged += new System.EventHandler(comboBox1_SelectedIndexChanged);
        comboBox1.DataSource = visiteurs;
        comboBox1.DisplayMember = "Name";
        comboBox1.SelectedItem = visiteurTemp;
    }

    public void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        visiteur = (VisiteVisiteur)comboBox1.SelectedItem;
    }

【问题讨论】:

  • 更改为comboBox1.DataBindings.Add("SelectedValue", this, "visiteur", true, DataSourceUpdateMode.OnPropertyChanged);
  • 我已经尝试过并收到此错误:无法绑定到从 Object 创建的数据源上的属性或列访问者。
  • 当前接受的答案是完全错误的。创建您的visiteur 属性,然后使用@Fabio 代码。

标签: c# winforms data-binding combobox


【解决方案1】:

Crowcoder 的答案只会将visiteur 设置为comboBox1.SelectedItem 一次。这就是为什么你需要使用SelectedIndexChanged手动更新

如果您将成员 visiteur 更改为属性,您可以进行正确的数据绑定(感谢 Ivan Stoev 的评论)

public VisiteVisiteur visiteur { get; set; }

然后设置数据绑定

comboBox1.DataSource = visiteurs;
comboBox1.DisplayMember = "Name";
comboBox1.DataBindings.Add("SelectedValue", 
                           this, 
                           "visiteur", 
                           true, 
                           DataSourceUpdateMode.OnPropertyChanged);

如果您仍然坚持手动更新visiteur,请使用SelectionChangesCommitted 事件而不是SelectedIndexChanged

【讨论】:

    【解决方案2】:

    使用DataSource 已经设置了绑定。你不想添加另一个,你想设置 SelectedItem 这是对象实例:

    comboBox1.DataSource = visiteurs;
    comboBox1.DisplayMember = "Name";
    comboBox1.SelectedItem = visiteur;
    

    【讨论】:

    • 您的代码只完成了一半的工作,因为我希望 visiteur 自动将其值更改为组合框 selectedValue
    • @Nerimah, visiteur 是值。你什么意思?
    • 不行,visiteur是绑定combobox值的变量,需要取comboBox1.selectedValue的值
    • @Nerimah,我认为您不了解组合框的工作原理。如果我理解你,你需要在组合框的 selectedindexchanged 事件中设置visiteur = combobox1.SelectedItem;
    • @Nerimah,如果正确答案被标记为正确,对未来的 Google 员工来说会更好。考虑不接受我的。
    猜你喜欢
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多