NHibernate,WinForms和DataBinding - 他们一起玩得很好吗?

时间:2010-01-18 23:32:08

标签: winforms nhibernate data-binding fluent-nhibernate

我一直在使用WinForms数据绑定来显示来自使用Fluent NHibernate映射的数据库中的数据,而且这种方法效果很好。

例如,我可以从实体的IList属性设置DataGridView的DataSource属性,并且瞧 - 所有数据都已存在!

但是现在我需要开始添加和保存新的数据行,而且这种情况并不顺利。我以为我只能启用网格的AllowUserToAddRows属性,并且新行将被添加到实体中的基础IList,但这不起作用。

然后,在稍微搜索之后,我尝试将DataSource属性设置为从IList填充的BindingList,但是没有使用新行更新。

在我的搜索过程中,我也遇到了一些人报告WinForms和DataBinding的困难,这让我想知道我是否应该继续采用这种方法。

DataBinding方法值得继续吗?如果是这样,任何人都可以建议我哪里出错了吗?

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

其他建议? (虽然我不认为切换到WPF会成为一种选择,无论数据绑定可能有多好)。

1 个答案:

答案 0 :(得分:5)

您可以将nHibernate实体加载(或复制)到通用列表中吗?如果是这样,我使用绑定到通用List的DataGridView进行双向绑定取得了很大成功。

关键点是:

  • 通用列表包含列表对象,其中每个列表对象都是自定义类的实例。
  • 您的自定义类必须为要绑定的每个字段实现公共属性。公共领域对我不起作用。
  • 使用BindingSource包装实际的通用列表。
  • BindingSOurce允许您将AllowNew属性设置为true。直接绑定到List几乎可以工作,但DataGridVieww不会显示“新行”行,即使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;
        }
    }
}

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