你能把你的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;
}
}
}
当窗体关闭时,绑定列表的内容将打印到输出窗口。