代码之家  ›  专栏  ›  技术社区  ›  Tom Bushell

NHibernate、Winforms和数据绑定-它们一起玩得好吗?

  •  3
  • Tom Bushell  · 技术社区  · 15 年前

    我一直在使用WinForms数据绑定来显示一个用Fluent NHibernate映射的数据库中的数据,这非常有效。

    例如,我可以从一个实体的ilist属性设置一个DataGridView的DataSource属性,瞧,这里有所有的数据!

    但现在我需要开始添加和保存新的数据行,这并不是很好。我以为我可以只启用网格的allowUserTodRows属性,新的行将被添加到实体中的基础IList中,但这不起作用。

    然后,在进行了一点搜索之后,我尝试将datasource属性设置为从ilist填充的bindingList,但也没有用新行更新它。

    在我的搜索过程中,我也遇到了一些人,他们普遍报告WinForms和数据绑定有困难,这让我怀疑我是否应该继续使用这种方法。

    数据绑定方法值得继续吗?如果是这样,有人能告诉我哪里出了问题吗?

    还是只处理与添加新行相关联的所有DataGridView事件,并编写自己的代码以将新对象添加到我的实体中的IList属性更好?

    其他建议?(尽管我不认为切换到WPF是一个选项,不管数据绑定有多好)

    1 回复  |  直到 15 年前
        1
  •  5
  •   Ash    15 年前

    你能把你的NHibernate实体载入(或复制)到一个通用列表中吗?如果是这样,我已经成功地使用绑定到通用列表的DataGridView进行了双向绑定。

    重点是:

    • 通用列表包含列表对象,其中每个对象都是自定义类的实例。
    • 自定义类必须为要绑定的每个字段实现公共属性。公共领域不适合我。
    • 使用BindingSource包装实际的泛型列表。
    • BindingSource允许您将AllowNew属性设置为true。直接绑定到列表几乎可以工作,但DataGridView不显示“新行”行,即使allowUsersToAddRows=true。

    例如,将此代码添加到具有DataGridView1的表单中:

        private List<MyObject> m_data = new List<MyObject>();
    
        private BindingSource m_bs =new BindingSource();
    
    
        private void Form1_Load(object sender, EventArgs e)
        {
    
            m_data.Add(new MyObject(0,"One",DateTime.Now));
            m_data.Add(new MyObject(1, "Two", DateTime.Now));
            m_data.Add(new MyObject(2, "Three", DateTime.Now));
    
            m_bs.DataSource = m_data;
            m_bs.AllowNew = true;
    
            dataGridView1.DataSource = m_bs;
            dataGridView1.AutoGenerateColumns = true;
            dataGridView1.AllowUserToAddRows = true;
    
        }
    
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            for (int i = 0; i < m_data.Count ; i++)
            {
                Console.WriteLine(string.Format("{0} {1}  {2}", m_data[i].ID, m_data[i].Name, m_data[i].DOB));                
            }
        }
    }
    
    public class MyObject
    {
        // Default ctor, required for adding new rows in DataGridView
        public MyObject()
        {
        }
    
        public MyObject(int id, string name, DateTime dob)
        {
            ID = id;
            Name = name;
            DOB = dob;
    
        }
    
        private int m_id;
        public int ID
        {
            get
            {
                return m_id;
            }
            set
            {
                m_id = value;
            }
        }
    
    
        private string m_name;
    
        public string Name
        {
            get
            {
                return m_name;
            }
            set
            {
                m_name = value;
            }
        }
    
        private DateTime m_dob;
    
        public DateTime DOB
        {
            get
            {
                return m_dob;
            }
            set
            {
                m_dob = value;
            }
        }
    }
    

    当窗体关闭时,绑定列表的内容将打印到输出窗口。