给定一个像这样设置BindingSource的DataGridView:
在winform上,我们使用名为myBindingScource的设计器添加一个BindingSource对象。 然后在Form.Designer.cs上我们将它添加到InitializeComponents()
myBindingSource.DataSource = typeof(MyLinq.Person); //Mylinq is the autogenerated Linq Model/Diagram
稍后,我们在表单中执行:
myDataView.DataSource = myBindingSource;
然后我们有一个填充网格的方法......
using ( myDataContext mdc = new MyDataContext() )
{
myDataView.DataSource = from per in mdc.person
select per;
}
另外,我已经在设计时设置了列,一切都显示正常。 由于LINQ 2 SQL没有返回Anonymous,因此“myDataView”是可编辑的,这就是问题......
问题是:如何坚持这些更改?
数据网格中有很多事件,我不确定哪一个更合适。即使我尝试了其中一个事件,我仍然不知道我需要执行什么代码才能将这些更改发送回数据库以便保留更改。
我记得在ADO.NET DataSet时代,你会做dataadapter.Update(dataset);
还想象一下,retrieve和persist()都在业务层上,方法签名如下所示:
public void LoadMyDataGrid(DataGridView grid);
该方法采用表单的网格并使用上面显示的LINQ2SQL查询填充它。
现在我想创建一个这样的方法:
public void SaveMyDataGrid(DataGridView grid); // or similar
这个想法是这个方法不在同一个类(表单)上,很多例子都倾向于假设一切都在一起。
答案 0 :(得分:3)
RowValidated事件是一个检查是否需要持续更改数据库的好地方。
this.dataGridView1.RowValidated += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_RowValidated);
private void dataGridView1_RowValidated(object sender, DataGridViewCellEventArgs e)
{
MyLinq.Person person = dataGridView1.Rows[e.RowIndex].DataBoundItem as MyLinq.Person;
if (person != null)
{
// save this person back to data access layer
}
}
修改后:
我不会将数据网格实例传回服务层。我会传回IEnumerable<MyLinq.Person>
或IList<MyLinq.Person>
,然后遍历服务层中的集合,并根据执行的逻辑;将更改保留到数据访问层(您的数据库)
答案 1 :(得分:1)
DataContext对象上的'save'方法是SubmitChanges()
。
using (MyContext c = new MyContext())
{
var q = (from p in c.People
where p.Id == 1
select p).First();
q.FirstName = "Mark";
c.SubmitChanges();
}
正如Michael G所提到的,你需要收集更改,并将它们传递回bll对象。