none
ListBox绑定List数据源的问题 RRS feed

答案

  • 原来可以用这个 BindingContext 一时忘了
    • 已标记为答案 vieri122 2009年9月10日 0:26
    2009年9月9日 5:17
  • 使用 BindingSource 绑定就可以了
    知识改变命运,奋斗成就人生!
    2009年9月9日 5:53
    版主
  • using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication13
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                this.InitSample();
            }
    
            private void InitSample()
            {
                ListBox listControl = new ListBox();
                List<Employee> listSource = new List<Employee>();
                BindingSource bs = new BindingSource();
                bs.DataSource = listSource;
    
                listControl.DataSource = bs;
                listControl.DisplayMember = "Name";
                listControl.ValueMember = "Id";
    
                // 事先绑定了,这时修改数据源会自动刷新界面显示
                listSource.Add(new Employee(1, "Sam"));
                listSource.Add(new Employee(2, "John"));
    
                this.Controls.Add(listControl);
            }
    
            public class Employee
            {
                public Int32 Id { get; set; }
                public String Name { get; set; }
                public Employee(Int32 Id, String Name)
                {
                    this.Id = Id;
                    this.Name = Name;
                }
            }
        }
    }
    

    知识改变命运,奋斗成就人生!
    • 已标记为答案 vieri122 2009年9月10日 0:26
    2009年9月9日 9:18
    版主
  • 请教一下XXY版主,能否直接这样:
    listControl.DataSource = listSource
    周雪峰
    如果 listSource 是 DataTable 是可以,但若是 List<T> 时对数据的修改界面不会更新,解决方面请看下面的代码,如果更好的方法请补充。
    知识改变命运,奋斗成就人生!
    • 已标记为答案 vieri122 2009年9月10日 0:27
    2009年9月9日 15:57
    版主

全部回复

  • 原来可以用这个 BindingContext 一时忘了
    • 已标记为答案 vieri122 2009年9月10日 0:26
    2009年9月9日 5:17
  • 使用 BindingSource 绑定就可以了
    知识改变命运,奋斗成就人生!
    2009年9月9日 5:53
    版主
  • 你好 可以通过CurrencyManager类来实现同步更新
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年9月9日 6:05
    版主
  • 回复楼上两位,你们说的方法我没用过,能给出示例代码吗?
    2009年9月9日 9:10
  • using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication13
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                this.InitSample();
            }
    
            private void InitSample()
            {
                ListBox listControl = new ListBox();
                List<Employee> listSource = new List<Employee>();
                BindingSource bs = new BindingSource();
                bs.DataSource = listSource;
    
                listControl.DataSource = bs;
                listControl.DisplayMember = "Name";
                listControl.ValueMember = "Id";
    
                // 事先绑定了,这时修改数据源会自动刷新界面显示
                listSource.Add(new Employee(1, "Sam"));
                listSource.Add(new Employee(2, "John"));
    
                this.Controls.Add(listControl);
            }
    
            public class Employee
            {
                public Int32 Id { get; set; }
                public String Name { get; set; }
                public Employee(Int32 Id, String Name)
                {
                    this.Id = Id;
                    this.Name = Name;
                }
            }
        }
    }
    

    知识改变命运,奋斗成就人生!
    • 已标记为答案 vieri122 2009年9月10日 0:26
    2009年9月9日 9:18
    版主
  • 请教一下XXY版主,能否直接这样:
    listControl.DataSource = listSource
    周雪峰
    2009年9月9日 10:34
    版主
  • listControl.DataSource = listSource,当listSource更新后,listControl貌似不会自动同步更新。
    2009年9月9日 10:42
  • listControl.DataSource = listSource,当listSource更新后,listControl貌似不会自动同步更新。

    貌似没有调用绑定把?
    2009年9月9日 10:56
  • 请教一下XXY版主,能否直接这样:
    listControl.DataSource = listSource
    周雪峰
    如果 listSource 是 DataTable 是可以,但若是 List<T> 时对数据的修改界面不会更新,解决方面请看下面的代码,如果更好的方法请补充。
    知识改变命运,奋斗成就人生!
    • 已标记为答案 vieri122 2009年9月10日 0:27
    2009年9月9日 15:57
    版主
  • using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace X.BindingSourceDemo
    {
        /// <summary>
        /// 示例:如何使用 BindingSource 绑定 ListBox,同时解决绑定 List<T> 后修改数据源不能同时刷新界面显示的问题
        /// 描述:1 下面的示例分别以 List<T>, BindingList<T> 及 DataTable 来绑定 ListBox
        ///        2 以 List<T> 作为数据源时直接对数据的修改界面不能刷新的问题可以通过以下三种方式来解决
        ///          a> 更新完数据后调用 BindingSource 的 ResetBindings
        ///          b> 通过 BindingSource 自带的方法来更新数据源
        ///          c> 使用 BindingList<T> 或 DataTable 对象来代替 List<T>
        /// 日期:2009-09-9
        /// </summary>
        public partial class Demo : Form
        {
            public class Employee
            {
                public Int32 Id { get; set; }
                public String Name { get; set; }
                public Employee(Int32 Id, String Name)
                {
                    this.Id = Id;
                    this.Name = Name;
                }
            }
    
            private BindingSource bs1;
            private BindingSource bs2;
            private BindingSource bs3;
            
            private List<Employee> listSource;
            private BindingList<Employee> bindingListSource;
            private DataTable dataTableSource;
    
            private Int32 index = 0;
    
            private ListBox listBox1;
            private ListBox listBox2;
            private ListBox listBox3;
            private Button btnAdd;
    
            public Demo()
            {
                InitializeComponent();
                this.InitClass();
            }
    
            private void InitClass()
            {
                #region " 初始数据源 "
    
                this.listSource = new List<Employee>();
                this.bindingListSource = new BindingList<Employee>();
    
                this.dataTableSource = new DataTable();
                this.dataTableSource.Columns.Add("Id", typeof(Int32));
                this.dataTableSource.Columns.Add("Name", typeof(String));
    
                this.bs1 = new BindingSource(this.listSource, null);
                this.bs2 = new BindingSource(this.bindingListSource, null);
                this.bs3 = new BindingSource(this.dataTableSource, null);
    
                for (index = 0; index < 5; index++)
                {
                    this.listSource.Add(new Employee(index, String.Format("Name of {0}", index)));
                    this.bindingListSource.Add(new Employee(index, String.Format("Name of {0}", index)));
                    this.dataTableSource.Rows.Add(new object[] { index, String.Format("Name of {0}", index) });
                }
    
                #endregion
    
                #region " 初始控件 "
    
                this.listBox1 = new ListBox();
                this.listBox1.Location = new Point(10, 12);
    
                this.listBox2 = new ListBox();
                this.listBox2.Location = new Point(150, 12);
    
                this.listBox3 = new ListBox();
                this.listBox3.Location = new Point(310, 12);
    
                this.btnAdd = new Button();
                this.btnAdd.Location = new Point(10, 120);
                this.btnAdd.Text = "添加";
                this.btnAdd.Click += new EventHandler(btnAdd_Click);
    
                this.listBox1.DataSource = this.bs1;
                this.listBox2.DataSource = this.bs2;
                this.listBox3.DataSource = this.bs3;
    
                this.listBox1.DisplayMember = "Name";
                this.listBox1.ValueMember = "Id";
    
                this.listBox2.DisplayMember = "Name";
                this.listBox2.ValueMember = "Id";
    
                this.listBox3.DisplayMember = "Name";
                this.listBox3.ValueMember = "Id";
    
                this.Controls.AddRange(new Control[] { this.listBox1, this.listBox2, this.listBox3, this.btnAdd });
    
                this.Size = new Size(500, 500);
                #endregion
            }
    
            private void btnAdd_Click(object sender, EventArgs e)
            {
                // 分别向三个数据源添加数据
    
                //#1 数据源对象 List<T>
                //方法一:当数据源发生改变时调用 ResetBindings
                //this.listSource.Add(new Employee(index, String.Format("Name of {0}", index)));
                //this.bs1.ResetBindings(true);
    
                //方法二:使用 BindingSource 自带的方法来更新数据源
                this.bs1.Add(new Employee(index, String.Format("Name of {0}", index))); //添加数据
                //this.bs1[0] = new Employee(1, "JJJ"); // 修改数据
                //this.bs1.RemoveAt(0); // 删除数据
    
                //#2 数据源对象 BindingList<T>
                this.bindingListSource.Add(new Employee(index, String.Format("Name of {0}", index)));
    
                //#3 数据源对象 DataTable
                this.dataTableSource.Rows.Add(new object[] { index, String.Format("Name of {0}", index) });
                this.index++;
            }
        }
    }
    

    知识改变命运,奋斗成就人生!
    2009年9月9日 15:58
    版主
  • 请教一下XXY版主,能否直接这样:
    listControl.DataSource = listSource
    周雪峰
    如果 listSource 是 DataTable 是可以,但若是 List<T> 时对数据的修改界面不会更新,解决方面请看下面的代码,如果更好的方法请补充。
    知识改变命运,奋斗成就人生!

    十分感谢XXY版主的解答!
    周雪峰
    2009年9月10日 4:53
    版主