本演练是DevExpress YouTube频道上提供的Entity Framework Data视频的抄本。
在本教程中,您将学习如何将网格控件绑定到Entity Framework数据源,如何使用数据注释属性来更改网格显示和管理数据的方式,以及如何将单元格值的更改发布回网格。数据源。
#起点
从一个具有Windows窗体和一个空GridControl的项目开始。该解决方案还默认包含一个名为Model1的实体框架模型。您可以双击它以在图表上查看其视觉表示。对于本教程,请使用AdventureWorks数据库的修改版本。它仅包含一个表,表中只有几个字段。
有关创建和修改Entity Framework模型的信息,请参考Microsoft的Entity Framework文档。
#绑定到实体框架数据源
将实体框架模型绑定到网格控件的最简单方法是使用“ 数据源配置向导”。调用网格控件的智能标记,然后单击“ 数据源向导”。
选择实体框架技术,然后选择现有的数据连接或创建一个新的数据连接。在本教程中,使用到示例Microsoft AdventureWorksDW2008R2数据库的现有连接。单击下一步继续。
在下一页上,将要求您选择所需的装订模式。选择“ 使用绑定源组件绑定”选项,然后单击“ 下一步”。
最后,选择要在网格控件中显示的表。
#绑定到实体框架数据的结果
现在,网格控件已绑定到EF数据,并且所有必需的代码已经生成。您可以在.CS文件中看到自动生成的代码。现在运行该应用程序以查看结果。
以下是有关网格如何显示其绑定数据的一些观察结果。
- 简单的数字格式应用于“ 价格”字段,但使用“货币”格式更有意义。
- “ 描述”字段包含冗长的值,因此很难在网格单元格中对其进行编辑。
- 网格足够智能,可以为绑定到日期时间字段的列分配特殊的编辑器。
- 列名只是从字段名派生的。
- 显然,没有将数据验证规则应用于网格。
#应用数据注释属性
可以使用GridControl设置更改所有默认行为。实现此目的的另一种方法是更改数据字段属性或数据注释属性。当您有多个控件绑定到同一数据源时,这可能会派上用场。这样,您不必设置相同的规则。看看这是如何工作的。
打开包含表数据模型的DimProducts.cs文件。在这里,您可以看到所有可用的数据字段,它们声明为DimProduct类的属性。
<span style="color:#505050"><code>
<span style="color:#0000ff">public</span> <span style="color:#0000ff">partial</span> <span style="color:#0000ff">class</span> <span style="color:#2b91af">DimProduct</span>
{
<span style="color:#0000ff">public</span> <span style="color:#0000ff">int</span> ProductKey { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> EnglishProductName { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> Nullable<<span style="color:#0000ff">decimal</span>> DealerPrice { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> <span style="color:#0000ff">string</span> EnglishDescription { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> Nullable<System.DateTime> StartDate { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
<span style="color:#0000ff">public</span> Nullable<System.DateTime> EndDate { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }
}
</code></span>
将数据属性添加到这些属性,并查看其如何更改网格行为。
注意
请注意,您的应用程序应引用System.ComponentModel.DataAnnotations库来这样做。
-
对于EnglishProductName字段,添加Required属性。这将不允许最终用户为该列的单元格设置空值。
[Required] public string EnglishProductName { get; set; }
运行该应用程序以确保不再允许使用空值。
-
对于DealerPrice字段,添加DataType属性以指示应将这些整数值视为货币数据。此外,应用范围属性设置最小和最大允许值。
[DataType(DataType.Currency), Range(200, 5000)] public Nullable<decimal> DealerPrice { get; set; }
-
对于EnglishDescription字段,使用DataType属性将数据类型从简单文本更改为多行文本。在显示属性将指定名称和说明的列。
[DataType(DataType.MultilineText), Display(Name = "Description", Description = "Detailed product description")] public string EnglishDescription { get; set; }
运行该应用程序以查看用于列标题的更新标题及其工具提示。另外,请注意,由于您将数据类型指定为多行文本,因此单元格现在使用MemoEdit。
-
最后,对于StartDate和EndDate列,应用不同的格式和编辑规则。第一个日期将被视为简单文本值。第二列的数据将保留为日期时间对象,但格式将更改为显示完整的月份,名称和年份。
[DataType(DataType.Text)] public Nullable<System.DateTime> StartDate { get; set; } [DisplayFormat(DataFormatString = "MMMM/yyyy")] public Nullable<System.DateTime> EndDate { get; set; }
启动该应用程序,然后在StartDate列中看不到任何特殊的编辑器。在结束日期列保持的编辑,但格式已经改变。
要了解有关所有现有数据属性的更多信息,请参见此MSDN文章。
#将数据发布回数据源
为了确保将网格控件中的单元格值更改重新发布回数据源,您需要添加几行代码。当网格引发ColumnView.RowUpdated事件时,保存更改。您需要访问数据源上下文,因此必须更改变量的范围,以便它对Form类中的所有方法均可用。在处理程序中,您需要做的就是调用SaveChanges方法。
<span style="color:#505050"><code>
DXApplication.AdventureWorksDW2008R2Entities dbContext;
<span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> <span style="color:#2b91af">gridView1_RowUpdated</span>(<span style="color:#0000ff">object</span> sender, DevExpress.XtraGrid.Views.Base.RowObjectEventArgs e) {
dbContext.SaveChanges();
}
</code></span>
现在运行该应用程序并更改“ 经销商价格”列中的值。将焦点移到另一行,以确保引发ColumnView.RowUpdated事件。然后,关闭该应用程序并再次运行。您将看到该值已保存。