【发布时间】:2014-02-02 17:30:15
【问题描述】:
这种方法是现有数据绑定数据网格视图的最佳方法吗?
我见过很多人在绑定数据网格视图时遇到问题,经过大量工作后,我发现这是最好的方法。我希望它可以帮助其他人,并且有人可以添加改进。
第 1 步)使用编辑器创建 dataGridView 及其列。
第 2 步)在 datagridview 中创建一个代表行的对象。
此对象可以根据需要包含任意数量的数据库实体实例。这是一个包含两个对象(datagridview 中的两列)的示例
public class ObjectToShow
{
MyDatabaseObject myDatabaseObject = new MyDatabaseObject();
public ObjectToShow(MyDatabaseObject myDatabaseObject)
{
this.myDatabaseObject = myDatabaseObject;
}
public string Data1 //to asign to a datagridview column
{
get { return myDatabaseObject.data1; }
set { myDatabaseObject.data1 = value; NotifyPropertyChanged("Data1")}
}
public string Data2 //to asign to another datagridview column
{
get { return myDatabaseObject.data2; }
set { myDatabaseObject.data2 = value; NotifyPropertyChanged("Data2"); }
}
//This is to notify the changes made to the object directly and not from the control. This refreshes the datagridview.
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
步骤 3)在表单中创建 ObjectToshow 的 BindingList 和 bindingSource,如下所示
BindingList<ObjectToshow> ObjectToShow_list = new BindingList<ObjectToshow>();
BindingSource bindingSource = new BindingSource();
第 4 步)以这种方式创建绑定
//if we don't put this, each public property in ObjectToshow will generate a new column in the datagridview
//I think it's best to create the columns from the editor.
dataGridView1.AutoGenerateColumns = false;
//database -> <- bindingList -> <- bindingSource -> <- datagridview <- user
bindingSource.DataSource = ObjectToShow_list;
dataGridView1.DataSource = bindingSource;
dataGridView1.Columns["Column_Data1"].DataPropertyName = "Data1";
dataGridView1.Columns["Column_Data2"].DataPropertyName = "Data2";
第 5 步)查询数据库
//Example bringing all the data from a database table. This should be done in a controller class.
My_DBModel DB_context = new My_DBModel();
List<myDatabaseObject> myDatabaseObject_list = DB_context.myDatabaseObject.ToList();
//Clear de previous data
ObjectToShow_list.Clear();
//Add the queried elements to the bindingList
foreach (myDatabaseObject item in myDatabaseObject_list)
{
ObjectToshow objectToshow = new ObjectToshow(item);
ObjectToShow_list.Add(objectToshow);
}
步骤 6) 根据需要修改 bindingList 或 datagridview 中的数据。然后 DB_context.saveChanges()。
要添加数据,直接添加到 DB_context.myDatabaseObject.Add(new ...) 并再次查询数据库;如果您想从 datagridview 添加它,我认为您必须处理该事件并将其添加到上下文中。
这就是我所做的并且有效,但我不确定这是否是最好的方法。提前致谢。
【问题讨论】:
-
Step 5)对我来说很不清楚。您的方法的主要优点之一是将数据库模型与业务模型分离。您可以通过创建一个可以保存多个表的属性的类来做到这一点。但是你只查询一张表。我写这篇文章的原因是,当你想从几个表中获取数据但把它放在一个对象中时,你会希望在数据库服务器端做尽可能多的工作,所以当你的查询被执行时,它会获取数据所以您可以直接填充对象属性。 -
@Leron 请具体告诉我第 5 步中不清楚的地方。也许我可以更新它来帮助你。
-
del Rio 我只是分享想法,我不需要特别帮助。如上所述 - 如果最后您只查询一个表,如果您不查询,那么我看不到付出所有这些努力的好处,如果您不这样做,那么如何构建表达式树就更重要了工作在数据库中完成。另外 - 在 MVC 设计中具有这样的东西 - 控制器中的
My_DBModel DB_context = new My_DBModel();不是你想要的。我认为更好的是另一个项目来照顾您的数据访问。 -
@Leron 你能放或链接一些例子吗?
-
稍后我会试着整理一下我的想法。现在我只想澄清一下,我并不是说你的方法行不通,或者会引起问题,我只是认为有些事情可以做得更好。如果您对我所说的内容感兴趣,请查看
Repository模式、Unit Of Work模式、一些依赖容器,例如Unity或NInject,并且您可能还想研究为什么使用 @987654331 @ 直接来自控制器不是 MVC 模式中的最佳方法。
标签: c# .net winforms entity-framework