【问题标题】:Object databinding c# winforms not working对象数据绑定c#winforms不工作
【发布时间】:2015-11-24 02:28:16
【问题描述】:

我看过很多关于数据库数据绑定的帖子,但没有一篇文章有​​助于将数据绑定到内存中的现有对象。我还查看了几个堆栈溢出帖子,人们说以下代码应该绑定了我的组合框上的属性:

        projectData = new ProjectData();

        this.parentTypeComboBox.DataSource = projectData.MobList;
        this.parentTypeComboBox.DisplayMember = "MobType";
        this.parentTypeComboBox.ValueMember = "MobType";

我的数据对象有各种属性的公共 getter/setter,我已经在类上添加了 INotifyPropertyChanged 接口,但到目前为止还没有将任何侦听器附加到事件中。从我读过的内容来看,这应该是我必须做的所有事情才能让控件绑定到我的数据对象。知道为什么当我的对象列表更改时我的组合框没有填充数据吗?

项目数据类:

public class ProjectData : INotifyPropertyChanged
{
    public static string PROJECT_OUTPUT_DIRECTORY = "..\\";
    private List<Mob> _mobList;

    public List<Mob> MobList
    {
        get { return _mobList; }
        set { _mobList = value; OnPropertyChanged("MobList"); }
    }

    public ProjectData()
    {
        MobList = new List<Mob>();
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }      
}

Mob 类:

//Snippet mob of class
public partial class Mob : IEquatable<Mob>, INotifyPropertyChanged
{
    public Mob()
    {
        dataAttributeField = new List<MobDataAttribute>();
    }

    private List<MobDataAttribute> dataAttributeField;

    private string mobTypeField;

    private string parentTypeField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("DataAttribute")]
    public List<MobDataAttribute> DataAttribute
    {
        get
        {
            return this.dataAttributeField;
        }
        set
        {
            this.dataAttributeField = value;
            OnPropertyChanged("DataAttribute");
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string MobType
    {
        get
        {
            return this.mobTypeField;
        }
        set
        {
            this.mobTypeField = value;
            OnPropertyChanged("MobType");
        }
    }
}

【问题讨论】:

  • EDIT/UPDATE 我最终为我的列表使用了一个 BindingList,它实际上确实允许控件在将某些内容添加到列表时自动更新。我仍然设置数据源/成员/值,但现在我的控件正在自动更新。
  • ^ 通过将方法附加到 ListChanged 事件:void MobList_ListChanged(object sender, ListChangedEventArgs e) { this.parentTypeComboBox.DataSource = projectData.MobList; this.parentTypeComboBox.DisplayMember = "MobType"; this.parentTypeComboBox.ValueMember = "MobType"; }

标签: c# winforms object data-binding combobox


【解决方案1】:

使用这个projectData = new ProjectData();,MobList 是一个空列表。

如果您没有填充数据,则应将数据填充到列表中以在 ComboBox 中显示。

请记住,每次填充数据时,都应该更新 ComboBox 的 DataSource 属性:

this.comboBox1.DataSource = parent.Childs;

如果您绑定到未实现 IBindingList接口,如ArrayList,绑定控件的数据 更新数据源时不会更新。例如,如果 你有一个绑定到 ArrayList 的组合框,并且数据被添加到 ArrayList,这些新项目不会出现在组合框中。

这是一个示例:

public partial class SampleForm : Form
{
    public SampleForm()
    {
        InitializeComponent();
    }

    private void SampleForm_Load(object sender, EventArgs e)
    {
        //Initialize parent and populate its Childs
        var parent = new Parent()
        {
            ParentName = "Parent 1",
            Childs = new List<Child>{
                new Child(){ChildName= "Child1"},
                new Child(){ChildName= "Child2"}
            }
        };

        this.comboBox1.DataSource = parent.Childs;
        this.comboBox1.DisplayMember = "ChildName";
        this.comboBox1.ValueMember = "ChildName";

    }

}

public class Parent
{
    public Parent()
    {
        Childs = new List<Child>();
    }
    public string ParentName { get; set; }
    public List<Child> Childs { get; set; }
}

public class Child
{
    public string ChildName { get; set; }
}

截图:

【讨论】:

  • 我忘了说一开始这个列表是空的,但是数据是在绑定完成后添加到其中的。
  • 以这种方式设置数据绑定后,每次更改数据时,都应重新设置数据源this.comboBox1.DataSource = parent.Childs;
  • 除了将事件附加到 onpropertychanged 并在其中重新绑定数据源之外,没有办法在对象发生更改时自动更新?
  • 在这种模式下,没有。但这没什么大不了的,只是在您加载数据的方法结束(或调用之后),this.comboBox1.DataSource = parent.Childs; 有许多不同的加载数据模式和数据绑定。而你正在使用的就是其中之一。
猜你喜欢
  • 2011-02-20
  • 2010-10-10
  • 1970-01-01
  • 2013-06-21
  • 2010-11-10
  • 2017-11-09
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
相关资源
最近更新 更多