数据绑定和数据网格视图(DataGridView)控件

数据绑定和数据网格视图(DataGridView)控件

数据网格视图控件,不像我们前面看到的控件,它可以显示多个列,但是,数据必须格式化,使数据网格知道要显示哪一列。有两种实现方法:一个是把数据网格视图绑定到数据表(DataTable),另一个是把网格到绑定对象列表,对象有许多属性,不同的属性就成为网格的列。

下面的例子是一种简单的解决方案,绑定到数据集(DataSet):

open System

open System.Collections.Generic

open System.Configuration

open System.Data

open System.Data.SqlClient

open System.Windows.Forms

// creates a connections then executes thegiven command on it

let createDataSet commandString =

//read the connection string

letconnectionSetting =

ConfigurationManager.ConnectionStrings.["MyConnection"]

//create a data adapter to fill the dataset

letadapter = new SqlDataAdapter(commandString, connectionSetting.ConnectionString)

//create a new data set and fill it

letds = new DataSet()

adapter.Fill(ds)|> ignore

ds

// create the data set that will be boundto the form

let dataSet = createDataSet "selecttop 10 * from Person.Contact"

// create a form containing a data bounddata grid view

let form =

lettemp = new Form()

letgrid = new DataGridView(Dock = DockStyle.Fill)

temp.Controls.Add(grid)

grid.DataSource<- dataSet.Tables.[0]

temp

// show the form

Application.Run(form)

运行前面的代码,可以看到如图 9-2 显示的结果。

图 9-2 绑定了数据的数据网格

若不使用 DataSet,还可以使用 F# 记录类型。这样,通常需要创建一个泛型函数(generic

function),通过反射(reflection)创建并发布强类型集合。下面的代码演示了这种泛型函数,把它包装在模块中,这样,就能更方便地把它用于其他代码,然后,用这个模块执行对数据库的查询:

module Strangelights.DataTools

open System

open System.Collections.Generic

open System.Configuration

open System.Data

open System.Data.SqlClient

open Microsoft.FSharp.Reflection

// a command that returns dynamicallycreated stongly typed collection

let execCommand<‘a> commandString :seq<‘a> =

//the opener that executes the command

letopener() =

//read the connection string

letconnectionSetting =

ConfigurationManager.ConnectionStrings.["MyConnection"]

//create the connection and open it

letconn = new SqlConnection(connectionSetting.ConnectionString)

conn.Open()

//excute the command, ensuring the read will close the connection

letcmd = conn.CreateCommand(CommandType = CommandType.Text,

CommandText = commandString)

cmd.ExecuteReader(CommandBehavior.CloseConnection)

// the generator, that generates anstrongly typed object for each row

let generator (reader : IDataReader) =

ifreader.Read() then

//get the type object and its properties

lett = typeof<‘a>

//get the values for the row from the reader

letvalues = Array.create reader.FieldCount (new obj())

reader.GetValues(values)|> ignore

letconvertVals x = match box x with | :? DBNull -> null | _ -> x

letvalues = Array.map convertVals values

//create the record and return it

Some(FSharpValue.MakeRecord(t, values) :?> ‘a)

else

None

// generate the sequence

Seq.generate

opener

generator

(funr -> r.Dispose())

例子代码的第一行使用了一个我们之前尚未用到过的方法,显式声明了函数的类型参数:

let execCommand<‘a> commandString :seq<‘a>

这样做,能够显式给定泛型参数‘a,这个类型参数然后用于创建类型对象,再对它做反射:

let t = typeof<‘a>

这个函数是用来处理 F# 记录类型,它的字段完全匹配查询结果的字段;如果不满足这个先决条件,代码就失败;然而,这个先决条件通常是在应用程序中以反射的形式使用的。

前面已经定义的泛型函数 execCommand,能够用于任何查询,匹配记录类型。下面的代码演示如何应用:

open System

open System.Windows.Forms

open Strangelights.DataTools

// a type that mirrors the type of rowbeing created

type Contact =

{ContactID: Nullable<int>;

NameStyle:Nullable<bool>;

Title:string;

FirstName:string;

MiddleName:string;

LastName:string;

Suffix:string;

EmailAddress:string;

EmailPromotion:Nullable<int>;

Phone:string;

PasswordHash:string;

PasswordSalt:string;

AdditionalContactInfo:string;

rowguid:Nullable<Guid>;

ModifiedDate:Nullable<DateTime> }

// a form containing a data bound data grid

let form =

lettemp = new Form()

letgrid = new DataGridView(Dock = DockStyle.Fill)

temp.Controls.Add(grid)

letcontacts =

execCommand<Contact>"select top 10 * from Person.Contact"

letcontactsArray = contacts |> Seq.to_array

grid.DataSource<- contactsArray

temp

// show the form

Application.Run(form)

最重要的是下面一行:

let contacts =

execCommand<Contact>"select top 10 * from Person.Contact"

为泛型函数 execCommand 显式声明了类型参数。这个例子的结果同前面的例子,如图 9-2 所示。

注意

使用对象-关系映射,比例NHibernate,执行这种任务已经相当普遍,这些工具提供了高度的灵活性,但它们往往过度依赖于纯正 C# 的功能,要想在 F# 中使用,体验并不良好,因此,我在书中没有讨论任何相关内容。但是,许多人,包括我自己正在努力解决这个问题;同时,建议你关注我的博客:http://strangelights.com/blog

数据绑定和数据网格视图(DataGridView)控件,布布扣,bubuko.com

时间: 2024-10-24 22:55:18

数据绑定和数据网格视图(DataGridView)控件的相关文章

DataGridView控件用法一:数据绑定

使用DataGridView控件,可以显示和编辑来自多种不同类型的数据源的表格数据. 将数据绑定到DataGridView控件非常简单和直观,在大多数情况下,只需设置DataSource属性即可.在绑定到包含多个列表或表的数据源时,只需将DataMember属性设置为指定要绑定的列表或表的字符串即可. 一.非绑定模式 所谓的非绑定模式就是DataGridView控件显示的数据不是来自于绑定的数据源,而是可以通过代码手动将数据填充到DataGridView控件中,这样就为DataGridView控

DataGridView控件-[引用]

DataGridView控件 DataGridView是用于Windows Froms 2.0的新网格控件.它可以取代先前版本中DataGrid控件,它易于使用并高度可定制,支持很多我们的用户需要的特性. 关于本文档: 本文档不准备面面俱到地介绍DataGridView,而是着眼于深入地介绍一些技术点的高级特性. 本文档按逻辑分为5个章节,首先是结构和特性的概览,其次是内置的列/单元格类型的介绍,再次是数据操作相关的内容,然后是主要特性的综述,最后是最佳实践. 大部分章节含有一个"Q &

实现虚拟模式的动态数据加载Windows窗体DataGridView控件 .net 4.5 (一)

实现虚拟模式的即时数据加载Windows窗体DataGridView控件 .net 4.5 原文地址 :http://msdn.microsoft.com/en-us/library/ms171624.aspx  译 Q:77811970 实现虚拟模式的原因之一 DataGridView控制只检索数据,因为它是必要的. 这就是所谓的 即时数据加载 . 如果你正在与一个非常大的表在一个远程数据库,例如,您可能希望避免启动延迟,只检索所需的数据显示和检索额外的数据只有当用户新行滚动到视图. 如果客户

困扰已久——DataGridView控件填充数据时自动添加列

    机房重构慢慢的走到了尽头,最近正在进行最后的润色中,今天解决了一个困扰许久但是非常简单的问题.我们在查询上机和充值记录时,用到了DataGridView控件.我们在VB版的机房收费系统中也用过类似的,不过显然没有.NET中如此灵活呀!     在填充数据时,我们分明已经写好了控件的列名,可是在填充数据时,会向DataGridView后面自动增加列,然后填充增加的列的数据,效果如下:    解决方法:        其中,DataPropertyName是绑定的数据源或者数据库中对应的字段

【机房重构】——使用DataGridView控件轻松显示数据(一)

在刚刚敲机房的时候遇到的问题就是DataGridView控件显示数据.好在被我解决了,好开心.下面分三部分来写这篇博客. 一.操作步骤 (1)新建一个WinForm窗体,在窗体中添加DataGridView控件,选中控件,点击控件上边缘的小三角,选择数据源,点击添加项目数据源. (2)选择数据源类型,此处应选数据库类型 (3)选择你的机房收费系统的数据连接,或新建连接,点击下一步. (4)根据你想要在窗体上显示的数据,选择数据库对象,包括要显示的列名后点击完成. (5)DataGridView控

C# DataGridView控件清空数据完美解决方法

C# DataGridView控件绑定数据后清空数据在清除DataGridview的数据时: 1.DataSource为NULL(DataGridView.DataSource= null;)这样会将DataGridView的列也删掉. 2.用DataGridview.Rows.Clear();  提示“不能清除此列表”!!!!! 以上都不是想要的结果.想要满足保持原有的列,就是重新绑定之前的DataTable,然后清除DataTable中的数据,如下: DataTable  dt  =  (D

转:C# DataGridView控件清空数据出错解决方法

C# DataGridView控件绑定数据后清空数据在清除DataGridview的数据时: 1.DataSource为NULL(DataGridView.DataSource= null;)这样会将DataGridView的列也删掉. 2.用DataGridview.Rows.Clear();  提示“不能清除此列表”!!!!! 以上都不是想要的结果.想要满足保持原有的列,就是重新绑定之前的DataTable,然后清除DataTable中的数据,如下: DataTable  dt  =  (D

在DataGridView控件中验证数据输入

实现效果: 知识运用: DataGridView控件的公共事件CellValidating //将System.Windows.Forms.DataGridViewCellValidatingEventArgs类的Cancel属性设为true  将阻止光标离开单元格 和CellEndEdit来处理 实现代码: private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e

C#:DataGridView控件操作

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 using System; using