我一直在使用WinForms数据绑定来显示来自使用Fluent NHibernate映射的数据库中的数据,而且这种方法效果很好。
例如,我可以从实体的IList属性设置DataGridView的DataSource属性,并且瞧 - 所有数据都已存在!
但是现在我需要开始添加和保存新的数据行,而且这种情况并不顺利。我以为我只能启用网格的AllowUserToAddRows属性,并且新行将被添加到实体中的基础IList,但这不起作用。
然后,在稍微搜索之后,我尝试将DataSource属性设置为从IList填充的BindingList,但是没有使用新行更新。
在我的搜索过程中,我也遇到了一些人报告WinForms和DataBinding的困难,这让我想知道我是否应该继续采用这种方法。
DataBinding方法值得继续吗?如果是这样,任何人都可以建议我哪里出错了吗?
或者,处理与添加新行相关联的所有DataGridView事件,编写自己的代码以将新对象添加到实体中的IList属性是否更好?
其他建议? (虽然我不认为切换到WPF会成为一种选择,无论数据绑定可能有多好)。
答案 0 :(得分:5)
您可以将nHibernate实体加载(或复制)到通用列表中吗?如果是这样,我使用绑定到通用List的DataGridView进行双向绑定取得了很大成功。
关键点是:
例如,将此代码添加到带有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;
}
}
}
当表单关闭时,绑定列表的内容将打印到“输出”窗口。