这个示例展示了如何在 Visual Studio 2005 的设计时刻,把一个 data-aware 控件 (XtraGrid、XtraPivotGrid、XtraVerticalGrid 等) 绑定到数据库。 注意,在控件被绑定到数据源之后,特定的控件可能需要额外进行定制。 关于这一问题的信息,请参阅相应控件的文档。

在本例中,一个 GridControl 控件被绑定到数据源,来呈现主/从关系。


Microsoft Visual Studio 2005 引入了 System.Windows.Forms.BindingSource 组件,可简化 data-aware 控件到数据的绑定。 请参阅 MSDN 中的 BindingSource 组件 [Windows 窗体] 主题。

本主题展示如何使用 BindingSource 组件把 XtraGrid 控件绑定到 NorthWind 数据库中的 "Orders" 和 "Order Details" 表 (nwind.mdb 文件与 data-aware DevExpress 控件的安装一同提供)。 这些表通过“一对多”关系链接 (第一个表中的一行,可以与第二个表中的一行或多行相关联;但是第二个表中的一行,只与第一个表中的一行相关联)。 在这个示例中,网格控件将把这些表呈现为主表和从表级(视图)。

在你执行完本示例中的下列步骤之后, 结果将与下面类似:

步骤 1-8. 创建数据对象

  1. 在 Visual Studio 2005 中新建一个项目。
  2. 在“工具箱”的“数据”组中找到 BindingSource 组件,并把它拖放到一个窗体上。 一个新的组件 (bindingSource1) 将会出现在窗体设计器底部的面板中。
  3. 在底部面板中选中 bindingSource1 组件,并打开“属性”窗口 (例如,通过按下 F4 键)。 然后为 DataSource 属性打开下拉表,并在它的底部单击“添加项目数据源(Add Project Data Source)...”链接。

    一个允许你选择需绑定数据源的对话框将出现。

  4. 选择数据库图标。单击[下一步]。

  5. 在下一个页面中指定 NorthWind 数据库的路径,然后单击[下一步]。 在下面的、询问是否将所创建的连接字符串保存到配置文件的页面中,也单击[下一步]。

  6. 下一个页面允许你选择需要从数据库中获取哪些表。 选中 "Orders" 和 "Order Details" 表,并单击[完成]。

    结果,Visual Studio 将生成一组支持 ADO.NET 架构的类。 一些主要的类是:

    • OrdersDataTable —— 呈现一个 DataTable 对象,将包含来自 NorthWind 数据库 "Orders" 表中的记录;
    • Order_DetailsDataTable —— 呈现一个 DataTable 对象,将包含来自 NorthWind 数据库 "Orders Details" 表中的记录;
    • nwindDataSet —— 呈现一个 DataSet 对象 (可相互关联的表的一个集合)。 这个生成的 DataSet 包含中了 OrdersDataTable 和 Order_DetailsDataTable 表,并指定了这两个表之间的一对多关系。
    • OrdersTableAdapter —— 呈现一个 TableAdapter 对象,可与 NorthWind 数据库中的 "Orders" 表通信。 TableAdapter 对象包含了从数据库表中获取数据的方法,和将数据传送到数据库表中的方法。
    • Order_DetailsTableAdapter —— 呈现一个 TableAdapter 对象,可与 NorthWind 数据库中的 "Orders Details" 表通信。

    当以上面所示的方法连接数据库时, Visual Studio 自动把 nwindDataSet 类的一个实例添加到窗体设计器的底部面板中。 你可以检查生成的数据集中是否包含了 OrdersDataTable 和 Order_DetailsDataTable 表。 要执行此操作,可在底部面板中选中 nwindDataSet 组件,并单击“在数据集设计器中编辑(Edit Data in DataSet Designer)...”任务:

    数据规划将被打开,如下图所示:

    你可以看到,两个表被自动通过关系进行链接。 关系信息已经从数据库中取出。

  7. 切换到窗体设计器,并重新生成项目。 在项目被成功生成之后,工具箱中将包含那些呈现已生成类的新项:nwindDataSet、 OrdersTableAdapter 和 Order_DetailsTableAdapter。

  8. 在工具箱中选中 OrdersTableAdapter 组件,并把它拖放到窗体上。 对 Order_DetailsTableAdapter 组件重复这种操作。 这些组件的新实例将出现在窗体设计器的底部面板中。

步骤 9-10. 绑定到 Grid

  1. 把 XtraGrid 组件拖放到窗体中。
  2. 这个网格控件必须被绑定到主表 ("Orders")。 在数据集中主/从关系所标识的从表数据将被自动获取并呈现为细节视图。 要绑定这个网格控件,可把它的 DataSource 属性设置为 "bindingSource1",把 DataMember 属性设置为 "Orders":

    在网格控件被绑定后,它自动为下层表中的所有字段创建网格列。 也请注意,在设计时刻这个网格控件显示了主/从展开按钮,指明下层数据源中包含了从表数据。

    现在如果运行项目,那么网格控件将是空的,因为下层的 OrdersDataTable 没有包含数据。 要使用数据装载它,需要编写如下面的步骤所示的代码。

步骤 11. 在运行时刻载入数据

  1. 要从数据库中为 DataTable 对象载入数据,则可以使用相应的 TableAdapter.Fill 方法。 在本例中, 使用 OrdersTableAdapter 和 Order_DetailsTableAdapter 对象(已经从工具箱中把它们拖放到窗体设计器的底层面板中)的 Fill 方法,为 OrdersDataTable 和 Order_DetailsDataTable 表载入数据。 窗体的 Load 事件被使用,来管理数据的加载:

     private void Form1_Load(object sender, EventArgs e) {
    ordersTableAdapter1.Fill(nwindDataSet.Orders);
    order_DetailsTableAdapter1.Fill(nwindDataSet.Order_Details);
    }

    现在如果运行这个项目,将会得到与下图相似的结果:

步骤 12-14. 定制网格

  1. 隐藏列

    这个网格的主视图(gridView1) 包含了过多的列。 尽管可以使用一个高级的有带区的网格视图(an Advanced Banded Grid View) 来在多个行中安排这些列,但我们只隐藏一些特定的列。 例如,隐藏 "ShippedDate" 列 —— 把它的标头拖出标头面板并放下 (鼠标指针将把它的形状改变为有十字叉)。

  2. 创建细节视图

    你可能注意到了在设计时刻,呈现从表("Order Details") 的细节视图还没有创建。 只有主表视图(gridView1) 被创建。 如果在设计时刻没有创建细节视图,那么在运行时刻,当主控行被展开时, XtraGrid 控件自动创建细节视图(基于主表视图的设置)。 要在设计时刻能够定制细节视图,你需要创建一个模式细节视图,例如使用网格控件的层级设计器(Level Designer)。

    在层级设计器中单击 Retrieve Details(取回细节) 按钮。 在接下来显示的对话框中单击[是]按钮。 结果, XtraGrid 返回所有下层数据源中的主/从关系,并把它们作为层呈现。 在本例中,只有一个细节层被创建。 它的名称 ("OrdersOrder Details") 与关系名相匹配:

    现在可以把一个特定的视图指派到所创建的细节层中。 单击 "Click here to change view(单击此处修改视图)" 链接,并选择“Create new view(新建视图) -> GridView”命令。

    这个网格将创建一个 GridView 类型的新视图,并把它与 "OrdersOrder Details" 层关联。 层级设计器的外观将与下图相像:

    在层级设计器(选中这个视图)中单击 gridView2 链接,然后在“属性”窗口中单击 Columns 链接:

    这会打开网格控件设计器的 Columns(列) 页面。 单击 Retrieve Fields(取回字段) 按钮,为下层从表中的所有字段创建列。

    在关闭设计器时, gridView2 将显示所有源自 "Order Details" 表的列。

  3. 其他任务

    你可能需要使用这个网格控件来执行许多任务。 为了帮助你找出与特定功能相关联的选项,可使用 功能浏览器(Feature Browser),它可以通过网格控件的设计器进行访问。 这是一个能找出许多问题的答案的、功能强大的工具。

步骤 15. 把数据传回数据库

  1. 你可以运行这个项目,并开始编辑数据。 所作出的修改将被保存在下层 DataTable 对象中,但不会保存在数据库中。 要完成这个示例,需要编写代码把在 OrdersDataTable 和 Order_DetailsDataTable 表中的改变传回数据库中。 接管 FormClosing 事件来实现此目标:

     private void Form1_FormClosing(object sender, FormClosingEventArgs e) {
    DevExpress.XtraGrid.Views.Base.BaseView view = gridControl1.FocusedView;
    if (!(view.PostEditor() && view.UpdateCurrentRow())) {
    e.Cancel = true;
    return;
    }
    ordersTableAdapter1.Update(nwindDataSet.Orders);
    order_DetailsTableAdapter1.Update(nwindDataSet.Order_Details);
    }

结果

下面的插图展示了在运行时刻形成的网格控件:

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------分割线----

以上是复制的原文档,下面是我实现的主从表数据绑定。

数据库:

控件:

我添加的代码:

         //在运行时刻载入数据
private void Form1_Load(object sender, EventArgs e)
{
productsTableAdapter1.Fill(nwindDataSet.Products);
categoriesTableAdapter1.Fill(nwindDataSet.Categories);
}
//把数据传回数据库
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
DevExpress.XtraGrid.Views.Base.BaseView view = gridControl1.FocusedView;
if (!(view.PostEditor() && view.UpdateCurrentRow()))
{
e.Cancel = true;
return;
}
productsTableAdapter1.Update(nwindDataSet.Products);
categoriesTableAdapter1.Update(nwindDataSet.Categories);
}

结果:

如何: 在 VS中的设计时刻主从表绑定控件到数据库的更多相关文章

  1. ASP.NET中共有哪几种类型的控件?其中,HTML控件、HTML服务器控件和WEB服务器控件之间有什么区别

    ASP.NET的控件包括WEB服务器控件.WEB用户控件.WEB自定义控件.HTML服务器控件和HTML控件.HTML控件.HTML服务器控件和WEB服务器控件之间的区别如下所示.q      HTM ...

  2. ASPxGridView中如何对主从表绑定数据

    注:在从表的aspxgridview中的(OnDataBinding()事件中绑定数据)-----代码如下 //绑定属性值表protected void grid2_sonTable_DataBind ...

  3. Excel中的表单控件和active控件

    EXCEL中有两种控件:表单控件和active控件 表单控件是excel5和excel95开始使用的,从excel97开始,active控件开始出现 关于表单控件和active控件的区别和使用范围,网 ...

  4. 安卓中的事件分发机制之View控件

    前言:Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent e ...

  5. C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序

    C#中缓存的使用   缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可:  <%@ Outp ...

  6. 基于Extjs的web表单设计器 第二节——表单控件设计

    这一节介绍表单设计器的常用控件的设计. 在前面两章节的附图中我已经给出了表单控件的两大分类:区域控件.常用控件.这里对每个分类以及分类所包含的控件的作用进行一一的介绍,因为它们很重要,是表单设计器的基 ...

  7. MVC树控件,mvc中应用treeview,实现复选框树的多层级表单控件

    类似于多层级的角色与权限控制功能,用MVC实现MVC树控件,mvc中应用treeview,实现复选框树的多层级表单控件.最近我们的项目中需要用到树型菜单,以前使用WebForm时,树型菜单有微软提供的 ...

  8. winform中button点击后再点击其他控件致使button失去焦点,此时button出现黑色边线,去掉黑色边线的方法

    winform中button点击后再点击其他控件致使button失去焦点,此时button出现黑色边线,去掉黑色边线的方法 button的FlatAppearence属性下,设置BorderSize= ...

  9. MVC中使用HTML Helper类扩展HTML控件

    文章摘自:http://www.cnblogs.com/zhangziqiu/archive/2009/03/18/1415005.html MVC在view页面,经常需要用到很多封装好的HTML控件 ...

随机推荐

  1. clamp 函数

    返回范围内的一个数值.可以使用 clamp 函数将不断增加.减小或随机变化的数值限制在一系列的值中. float clamp(float minnumber, float maxnumber, flo ...

  2. 基于AspectJ的XML方式进行AOP开发

    -------------------siwuxie095                                 基于 AspectJ 的 XML 方式进行 AOP 开发         1 ...

  3. php页面的基本语法

    概述: 1. PHP 脚本在服务器上执行,然后将纯 HTML 结果发送回浏览器. 2. PHP 脚本以 <?php 开始,以 ?> 结束,可以放到文档中的任何位置. 3. 当 PHP 解析 ...

  4. sqlserver 几种datatime的区别

    参考文章1 smalldatetime 占4位精确到分钟.时间从1900.1.1到2079.6.6datetime占8位精确到毫秒.时间从1753.1.1到9999.12.31 参考文章2 datet ...

  5. [leetcode]158. Read N Characters Given Read4 II - Call multiple times 用Read4读取N个字符2 - 调用多次

    The API: int read4(char *buf) reads 4 characters at a time from a file. The return value is the actu ...

  6. php的静态化

    原理,将动态的页面,存储为静态的HTML静态页,使浏览器直接请求该静态页. 测试:一个PHP动态页面与一个静态页面所消耗的时间 一般可以使用apache自带的ab(apache bench)程序来测试 ...

  7. .NET中的Request

    获得浏览器中的URL 例:http://121.41.30.93:8010/ch/spell.aspx?id=58 Request.Url.PathAndQuery:/ch/spell.aspx?id ...

  8. mysql contact_ws函数 字符串被截断问题

    contact函数默认有字符串长度限制,解决方法:SET group_concat_max_len = 20000这个参数设置一下就好了

  9. Codeforces C. NP-Hard Problem 搜索

    C. NP-Hard Problem time limit per test:2 seconds memory limit per test:256 megabytes input:standard ...

  10. maven web 项目 打入 jar 包 , 和编译入 java 文件到 web-inf 下

    <outputDirectory>src\main\webapp\WEB-INF\classes</outputDirectory> 可以把 类文件编译到 web-inf 下 ...