数据绑定

2024-10-28

数据绑定(通用8篇)

数据绑定 篇1

1 引言

数据绑定是从一个对象中提取信息, 并在应用程序的用户界面中显示所提取的信息。同时这种绑定存在着单向绑定, 即只能够查看绑定的信息; 双向绑定, 即既能查看绑定的信息也能够修改绑定的信息。是开发应用程序时经常使用到的一种技术。

WPF ( Windows Presentation Foundation) 是一种用 于Windows的图形显示系统。与以往的Windows窗体不同, WPF是针对.NET这一技术而设计的, 受现代显示技术 (如HTML和Flash) 以及硬件加速技术的影响。

介绍的就是基于WPF和Visual C# 编程语言进行窗体控件数据绑定的相关流程以及代码编写。这与以往的Windows窗体开发过程中的数据绑定既有相似的地方也有其自身的特点。特别是在后台的实现方式上有重大的改变, 增加了很多新功能和细微调整。虽然与Windows窗体开发中的数据绑定使用了一些相同的概念, 但在实现中却是不同的代码。

在基于数据库进行信息系统软件开发过程中, 总是要与数据库中各种各样的数据打交道。以一个简单的员工管理系统作为例子。 在员工数据库中存在一张员工信息表, 表中有字段“ID”、“Name”、“Tel”分别记录了员工的“编号”、“姓名” 和“联系电话”。为了简单起见, 只列举了少数几个字段, 方便进行演示。字段的多少对采用的方法没有任何影响。

在员工管理系统的用户界面上, 希望当用户只要查找或点击某一个员工的编号, 与员工编号的相关联的信息就相应出现, 例如此员工编号的姓名和联系电话。如图1所示。

要实现这个功能, 不使用数据绑定技术当然也能够实现。但是这是需要大量的代码来实现的, 在上面的演示中只使用了3个控件来显示数据 , 而且数据库中的字段也只有寥寥几个。如果应用到一个庞大的数据库系统中, 如果对每一个控件或是字段的显示都要通过代码来实现那将是一个复杂的工程, 而且非常容易顾此失彼, 出现各种各样的错误。

而使用数据绑定技术, 只需要不多的代码就能够实现这一功能, 而且易修改、易维护。

2 数据绑定前的准备工作

在与数据库连接之前, 先建立一个员工类Employee类, 代码如下:

在这个员工类中, 具有3个属性, 分别记录了员工的编号、姓名和电话。这是需要在控件中显示和修改以及保存的信息。

在数据绑定中, 一般绑定的数据都来自数据库中。例如要绑定 的数据库 中存在一 张员工表 , 表中有字 段“ID”、“Name”、“Tel”。首先要将数据库代码封装到一个专门的类中。这个类中主要提供查找数据的各种方法, 再建立数据访问类的基本框架:

小技巧之一: 如何在整个应用程序中使用同一个数据库实例。

建立了数据库类, 但是发现存在一个问题。当在不同的窗体或自定义控件中需要访问数据库时, 必须在每一个窗体或者自定义控件中, 创建StoreClass类的一个实例。这样才能保证在窗体或自定义控件中做到对数据库的访问。

这种做法既麻烦又效率低下。需要一种方式使得在整个应用程序中只需创建StoreClass类的单一实例, 就能够在整个应用程序中访问数据库。

解决办法就是在Application类中创建 一个实例 , 通过Application类的静态属性使用该实例。具体代码如下:

这样当需 要使用StoreClass类中的GetOneInformaiton ( ) 方法时, 就直接调用App.DB.GetOneInformation ()。

3 单个对象的数据绑定

经过前面的工作, 现在需要做的就是将绑定对象显示出来。首先需要在窗体的.xaml文件中编写相应的XAML代码。这主要是设计控件在窗体中的位置和相应功能。代码中加粗的部分就 是对控件TextBlock的Text属性进行绑定。将Employee类中的属性“ID”、“Name”和“Tel”分别绑定到3个TextBlock控件上。

但仅仅这样是不够的, 现在虽然程序已经可以运行, 但控件上不会显示任何信息。这是因为虽然定义了绑定, 但是没有获得数据的源对象。要实现数据绑定, 就要对Grid控件中的DateContext属性进行 设置。首 先将Grid控件命名 为“DateBinding” , 然后设置其DateContext属性。设置成功后 , 所有绑定表达式都会通过该属性使用数据填充自身。

当用户单机“获取一个员工信息”按钮时, 会响应下面的事件处理程序。

小技巧之二: 如何处理具有Null值的绑定。

通过以上代码, 可以获得员工表中的信息, 并将其绑定在相应的控件上。但是在数据库中可能会有可空字段, 在字段中Null值表示值缺失或是值不可用。为了处理这类信息的显示 , 可以在绑定表达式中设置TargetNullValue属性改变WPF对null值的处理。例如 , 当Employee.tel属性值为null值时 , 要显示为“无具体信息”, 可以在Textblock中添加以下代码:

Text="{Binding Path=Tel, TargetNullValue=[无具体信息]}"

TargetNullValue属性中方括号内的值可以自定义设置 , 用来帮助用户确认显示的文本不是来自于数据库中的值。

4 对象集合的数据绑定

通过前面的步骤, 已经将数据绑定到单个对象上去了, 而且非常直观。现在讨论如何将数据绑定到对象集合中去, 这一功能也是经常使用到的。例如在员工信息管理系统中, 当然不能只有一个员工, 要使每一个员工的信息都能够只需轻轻一点就能够显示出来, 这就需要将数据绑定到对象集合中去。

依旧以前面的员工表为例, 这次使用了一个ComboBox控件命名为“MoreDate”来显示所有员工的编号。为了简要说明, 所以在数据库中一共只有两个员工。如果要显示更多数量的员工信息, 方法是一样的。

首先在数据库中需要定义一个方法, 来查找所有员工的信息。

然后当点击“获取所有员工信息”按钮时, 响应一个事件。

经过这两步就已经通过访问数据库将需要显示的信息已经提取出来, 下面就将这些数据绑定到窗体控件上去。实现的方法有几种, 采用最快并且最少编写代码的方式来实现。那就是对Grid.DataContext属性设置绑定表达式。

当首先显 示窗体时 , 在列表中 没有选择 任何内容 , ComboBox. SelectedItem属性值为Null, 所以不会显示任何信息。点击完“获取所有员工信息” 按钮后, 再点击ComboBox控件就会发现, 里面有所有员工的编号。点击其中员工的编号, 在其他已存在绑定表达式的控件中就会出现相应内容。如

图2所示。

小技巧之三: 如何让ComboBox显示需要的信息

当ComboBox. ItemsSource获取的是一个实例的所有信息时, 如果不做处理, 那么当点击控件时, 会看到的是这个类, 而不是需要的信息。如图3所示。

如果要显示员工编号, 就需要对控件进行处理。要设定ComboBox.DisplayMemberPath属性。将此属性设置为“ID”。

这样就可以得到需要的效果。

5 结语

通过以上几步, 就完成了对窗体控件的数据绑定。发现这已经具备了很多的功能。

(1) 可以很方便地点击员工编号就可以看到员工的其他信息, 如: 姓名和电话。

(2) 可以修改员工信息中的内容 , 可以轻松修改TextBox控件中的内容。

(3) 修改的内容已经保存 , 并提交。例如修改了某编号 下员工姓名, 会发现这种改变已经保存下来。当再次点击此员工编号, 姓名中显示的是更新后的信息。当然这种改变仅仅只是控件显示信息, 在数据库中的信息还是需要使用UPDATE方法对其进行更新。

通过数据绑定, 就让窗体控件具备了这麽多强大的功能。而且这些功能只是用少量的代码就实现了, 在降低了代码维护难度的同时提高了代码的重用性, 无疑增加了软件开发的效率。这对在信息系统类应用程序开发过程中经常遇到的人机交互界面指明了一条简捷之路。

数据绑定 篇2

1.首先我们要定义一个接口,接口里定义我们需要实现的方法

?

1

2

3

4

public interface ICount {

public int getcount;

}

2.接下来我们需要一个Service的子类实现本接口,定义一个ServiceBinder的内部类,通过它的对象来绑定数据,要注意的是我们如果要进行耗时操作的话,仍然需要在Service中创建线程,Service自身就是运行在主线程中的,还有一个就是OnBind的返回值是IBinder,但是这里我使用ServiceBinder对象是继承Binder的,那为什么这里可以这么写呢?因为Binder是Base class for a remotable object, the core part of a lightweight remote procedure call mechanism defined by IBinder,是直接从IBinder这里的直接子类。

?

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

public class BackGroundService extends Service implements ICount {

private boolean disable; //线程是否执行的标识位

private int count;     //计数

private ServiceBinder serviceBinder = new ServiceBinder();

public class ServiceBinder extends Binder implements ICount {

@Override

public int getcount() {

// TODO Auto-generated method stub

return 0;

}

}

@Override

public IBinder onBind(Intent intent) {

// TODO Auto-generated method stub

return serviceBinder;

}

@Override

public void onCreate() {

// TODO Auto-generated method stub

super.onCreate();

new Thread(new Runnable() {

// @Override

public void run() {

while (!disable) {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

}

count++;

System.out.println(“CountService Count is ” + count);

}

}

}).start();

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

// TODO Auto-generated method stub

return super.onStartCommand(intent, flags, startId);

}

@Override

public int getcount() {

return count;

// TODO Auto-generated method stub

}

@Override

public void onDestroy() {

// TODO Auto-generated method stub

this.disable = true;

//     Log.v(“ CountService ”, “ on destroy ”);

System.out.println(“Service destroy...”);

super.onDestroy();

}

数据绑定 篇3

随着计算机技术和网络的发展, Web以多种方式进入人们的生活。数据库发布是当前Web技术最常见的应用之一。通常数据动态网页需要通过客户端与服务器的交互操作实现, 用户向服务器发出请求, 服务器使用ASP、CGI、PHP、Java Applet、Cold Fusion等网络脚本程序以获取用户提交的信息, 脚本程序在访问数据库后将处理结果返回给用户, 最终生成动态页面。这种方式一方面要求服务器提供上述服务, 另一方面由于这种方式对服务器的依赖性很强, 会加重服务器的负担和网络拥挤程度。在使用方面, 由于用户的每一次请求都必须依赖于服务器的处理才能显示在客户端, 这样多次往返于服务器, 必定减慢了查询速度。

基于以上原因, 根据浏览器Internet Explorer 4.0及以上版本具有接收、放置、计算和显示等数据认知的能力, 笔者将数据绑定技术 (Data Binding) 和表格数据控件TDC (Tabular Data Control) 相结合, 利用它们访问有限定符文本文件, 以HTML文件为模板显示数据, 并通过对已缓冲至本地机的文本文件操作, 实现访问客户与数据驱动页面的动态交互功能。该方法不依赖于ASP、CGI等服务器端的处理实现动态交互, 减少了动态网页对服务器的依赖程度, 从而减少了服务器的压力和缓解了网络拥挤。下文将进行详细的介绍, 以供参考。

1 数据绑定技术

数据绑定由4个部分组成:数据源对象 (DSO Data Source Object) 、数据引用 (Data Consumer) 、绑定代理 (Binding Agent) 和列表 (显示) 代理 (Table Repetition Agent) 。数据源对象提供数据传输、操作和通过脚本访问数据的能力;数据引用一般指Web页面元素, 它定义数据如何显示等;绑定代理用于数据识别和维护;列表 (显示) 代理用于保证列表数据的正确引用。

2 TDC组件

TDC是IE 4.0及以上版本提供的一个内置表格数据控件, 利用它, 用户客户端的浏览器可以从服务器端接收到把定界符文本文件作为数据源的文本型表格数据, 并根据需要可以进行不同方式的显示, 如分页显示、逐条显示、排序、过滤、查找等, 从而实现在本地机的客户端对数据的动态控制功能。TDC实现数据动态网页的所有执行过程都在客户端中进行, 不依赖于服务器端的网络脚本程序的逻辑处理, 减少了数据绑定到网页HTML 元素中动态网页对服务器的依赖程度, 由此减轻了服务器的负荷和缓解了网络的拥挤。

2.1 TDC控件

TDC称为表格式数据控件, 是一个ActiveX控件, 文件名为tdc1ocx, 该文件位于C:\WINNT\System32\tdc1ocx。ActiveX控件是指一些可执行的代码或一个程序, 比如一个.EXE、.DLL或.OCX文件, 通过ActiveX技术, 程序员就能够将这些可复用的软件组装到应用程序或者服务程序中去, 嵌入到网页中, 随网页传送到客户的浏览器上, 并在客户端执行。通过编程, ActiveX控件可以与Web浏览器交互或与客户交互。

TDC控件标识符是CLSID:333C7BC4-460F-11D0-BC04-0080C7055A83。TDC控件提供访问有定界符文本文件的能力, 拥有Datasrc、Data-formats、Fielddelim、Textquqlifier、Rowdelim、Sort、Filter和Useheader等属性及Reset方法, 并可通过TDC对象的ID.recordset.{Properties|method}访问相应的Recordset集的属性和方法。

2.2 作为DSO的文本型表格数据

表格一般和数据库对应, 在有定界符文本文件中的一行相当于数据库的一个记录, 每行中由定界符括起来的字符串相当于记录中的字段。在TDC引用的文本文件中有3种定界符:文本限定符、字段限定符和行限定符。假设文本文件GetNew-AQList.txt中有如下内容:

IsSelected, HasRead, DiffDepartment, Department, name, duty, sort, class

'是', '是', '六矿', '调度室', '王丙', '聂军, '采煤', 'AAA'

'否', '是', '六矿', '机电科', '王丙', '聂军', '采煤', 'AAA'

'否', '否', '六矿', '机电科', '聂军', '李二', '采煤', 'AAA'

'否', '否', '六矿', '机电科', '李二', '采煤', 'AAA'

'是', '是', '六矿', '机电科', '李二', '采煤', 'AAA'

第一行为字段的名称, 第二~六行为5个记录。其中, 单引号 (') 是文本限定符, 逗号 (') 是字段限定符, 行限定符通过换行来实现。如果一条记录中有字段值是空, 也可以使用空格来代替, 例如上面的第五、六条记录中, 字段“duty”的值都为空。

3 TDC的实际应用

结合在鹤壁煤业 (集团) 公司煤矿安全隐患信息动态跟踪管理系统中的实际应用, 详细介绍如何将TDC、DSO和HTML元素组合在一起实现动态数据网页。

3.1 数据源的设定

在鹤壁煤业 (集团) 公司煤矿安全隐患信息动态跟踪管理系统中, 由于要应用到多个表中的大量数据, 而且这些信息在隐患信息数据库中已经有记录, 如果再建立数据库记录将会造成数据冗余。而如果对每条信息都用综合查询进行检索, 将会增加服务器负担。为了减少数据冗余和方便查询, 先用复合查询查出需要用到的字段, 再构建出一个临时数据库, 将需要的信息插入里面, 需要用到时在临时数据库中检索即可。

3.2 在Web页中引用TDC组件

在Web页调用TDC控件, 需要在Web页的头部或主体内用〈Object〉…〈/Object〉语句建立TDC对象的实例, 先定义一个对象, 名为List, 其中的数据源从Get-NewAQList.asp页面中获得, Get-NewAQList.asp页面中的数据即为查询出的临时数据库的信息, 然后调用List对象, 将其中的信息显示出来:

其中, ID为对象指定一个名称, 以便在以后的Web元素中引用;参数DataURL指定TDC读取数据的文本文件;参数FieldDelim定义字段限定符, 标识数据字段结束的字符, 默认值为一个逗号;参数Charset为数据文件描述字符的字符串表达式;参数TextQualifer定义文本限定符, 用来在文件中描绘文本字符串的一个字符;参数UseHeader的Ture和False指定在文本文件中是否有字段名定义。

3.3 将数据绑定到Table元素

Table是一种可以进行多值绑定的HTML元素, 〈Tr〉…〈/Tr〉对应1个记录, 〈Td〉…〈/Td〉对应1个字段, 在这2个元素对中, 利用可以单值绑定元素引用数据, 在页面上显示具体数据内容。如:

在〈table〉..〈/table〉中输出的就是需要的网页动态数据。在上面的代码中, 利用数据引用组件的DataSRC、DataFLD及DataFormats、DataPageSize属性, 通过ID属性将文本文件的数据内容绑定到HTML元素, TDC控件自动将符合要求的数据内容显示在页面中。其中DataSRC用来指定要绑定到HTML元素上的DSO, 其值为#嵌入网页的数据对象的ID号, 例如DataSRC=#List;DataFID向HTML元素指定要绑定的数据源中的列名, HTML元素将显示该列中的数据, 即某一字段需要显示的数据;DataFormats设定数据格式, 如html、text等。缺省情况下, Table总是显示记录集中的所有记录, 当数据记录很大时, 可能造成网页过长, 这时可以利用DataPageSize属性限定Table每次显示的记录数, 然后利用Table的NextPage和Previous Page属性来依次显示记录集的所有记录。

3.4 TDC的其它属性和语法

TDC的其它属性和语法如表1所示。

4 结语

本文以鹤壁煤业 (集团) 公司煤矿安全隐患信息动态跟踪管理系统为例, 探讨了如何利用TDC数据绑定实现动态数据网页的方法。数据绑定和TDC控件改变了在Web页上数据访问的性质, 提供了脱离服务器端有关处理逻辑的支持而实现动态Web页面的方法和工具。结合DHTML提供的大量新技术、新方法和控件, 可以对TDC控件和Web页面元素进行更多、更精确的控制, 它的编写简单、灵活控制、易于更新、动态检索等特性, 非常适用于小型动态数据库。实践表明, 该方法应用效果良好。

参考文献

[1]陈立华.TDC数据绑定实现图书馆动态数据网页[J].现代图书情报技术, 2003 (2) .

[2]王国荣.Active Sever Page&Web数据库[M].北京:人民邮电出版社, 1999.

[3]陈媛.用数据绑定实现高效率动态网页[DB/OL]. (2007-12-26) [2009-03-07].http://www.sudu.cn/info/ht ml/edu/20071226/31724.ht ml.

数据绑定 篇4

关键词:.Net编程技术,数据绑定,网页

.Net Framework提供了数据绑定的功能, Asp.Net中数据绑定 (Data Bind) 是使页面上的控件的属性与数据库中的数据产生对应关系, 使得控件的属性与数据库的变动同步, 同时有利于界面与逻辑的分离, 是Asp.Net中经常使用的一种非常重要的技术。Asp Net的数据绑定技术非常灵活, 且数据源非常丰富, 要想用好它, 这就必须深入了解.Net数据绑定技术, 掌握其对数据、控件的要求及限制, 目前众多.Net教程未能给出相关的说明, 致使程序设计者在学习使用时走了许多弯路, 甚至不知出错在何处, 网上也常看到为此求助信息。因此理出清晰的数据绑定方法与思路, 对掌握.Net编程技术受益非浅。

1 数据绑定形式与适用范围

1.1 数据绑定的数据源

数据的绑定的各种数据源, 可以是变量、表达式、列表、数据库、XML文档、其他控件的信息。

1.2 数据绑定形式

无论是何种形式的数据绑定, 呈现的数据绑定表达式必须包含在<%#和%>字符之间, ASP的<%=str%>方式基本上被摈弃。

例见:绑定到变量:<%#User Name%>

绑定到简单属性:Text="<%#变量名%>", 或服务器控件的属性值

例如:

绑定到集合:'runat="server">

绑定到表达式:<%# (class1.property1.To String () +", "+class1.property2.To String () ) %>

绑定到方法返回值:<%#Get Safestring (str) %>

绑定到Hashtable:<%# ( (Dictionary Entry) Container.Data Item) .Key%>

绑定到Array List:<%#Container.Data Item%>

注意:若数组里放的是对象则可能要进行必要的转换后再绑定如:

<%# ( (对象类型) Container.Data Item) .属性%>

绑定到Data View, Data Table, Data Set:

<%#DataBinder.Eval (Container.DataItem, "xxxx") %>

或者

<%#DataBinder.Eval (Container, "DataItem.xxxx") %>.NET Framework 2.0.NET Framework 3.0.NE

在.NET Framework 2.0以上版本.NET Framework 3.0.NET Framework 3.5.NET Framework 4中还有

<%# ( (Data Row View) Container.Data Item) ["字段名"]%>或

<%# ( (Data Row View) Container.Data Item) .Rows[0]["字段名"]%>

ASP.NET数据绑定语法支持公共变量、页面的属性和页面中其它控件的属性的绑定。但由于数据绑定表达式的值是String类型的, 对于生成期望的结果常需要进行强制转换值的类型, 这一点经常被忽视而致出错。

1.3 数据绑定适用范围

数据绑定表达式可以是一个变量, 可以是一个带返回值的C#或者VB.NET方法, 还可以是某个控件的某个属性的值, 也可以是C#或者VB.NET对象的某个字段或者属性的值等等, 数据绑定表达式可以出现在页面的位置如下:

1) 数据绑定表达式包含在页面中的位置, 通常将数据绑定表达式包含在服务器控件或者普通的html元素的开始标记中“属性名.属性值”对应的值侧。

例如以下的引用:

'>

注意:并不是所有的HTML属性都可以绑定, 有些属性例如runat属性必须是"server"常量, 即使绑定的字符串是server, 也会导致分析器分析时出错;而服务器控件中Head Template之类也不适宜数据绑定。

2) 可以将数据绑定表达式包含在Javascript代码中, 从而实现在Javascript中调用C#或者VB.NET的方法。

例如:Deafult1.aspx:

一般只要绑定的数据和Java Script中数据类型兼容即可。

3) 可以是用Bind, Date Bind.Eval, Eval取得的数据表的字段, 这种最常用于服务器控件的绑定, 用法也较复杂, 以下将重点介绍它们的用法。

2 复杂数据源的绑定

复杂数据源主要有Data View、Data Set和各种数据库等。这时常常用到与数据有关的控件Drop Down List, List Box, Check Box-List, Radio Button List以及数据服务器控件Grid Veiw (Data Grid) 、Data List、Reapter。首先要将ADO.NET的Data Reader、Data Set或者是Data Table对象赋给控件的Data Source属性, 然后执行控件的Date Bind方法。

例如:在Deafult2.aspx页面初始化程序Page_Load中添加如下代码

所有的Data Bind都应该用Data Bind () 函数来建立数据绑定, 是整个页面PAGE和所有控件的一个方法, 也就是说, 如果用的是Page的Data Bind方法, 那么整个页面所有绑定都会执行。它可以被页面所有的控件使用。如果只执行某控件Data List1或者DropDown List1之类的Data Bind方法, 那么只有相应控件的绑定才会发生, 这也是容易出错的地方。Data Bind常在页面载入Load时就被绑定。

3 与数据库有关的数据绑定方法的比较

获取一个数据源然后绑定到页面、Grid View……也就是用Data Bind () 方法绑好了, 就可以使用绑定表达式将数据绑定在页面上, 在页面的呈现数据时经常会用到如下多种形式的数据绑定表达:

ASP.NET 2.0改善了模板中的数据绑定操作, 把v1.x中的数据绑定语法Data Binder.eval_r (Container.Data Item, fieldname) 简化为eval_r (fieldname) 。Eval方法与Data Binder.Eval一样可以接受一个可选的格式化字符串参数, 最后一个参数设定字段的显示样式。例如c代表货币, p代表百分号, d代表短日期格式显示, f代表浮点数现实, f3代表小数点后三位, 依次类推。

在.NET Framework 2.0以上版本中还有

<%# ( (Data Row View) Container.Data Item) ["字段名"]%>

<%#string.Format ("{0:c}", ( (Data Row View) Container.Data Item) ["字段名"]) %>

用String.Format方法设定字段的显示样式。例如c、p、d、f代表格式同上。

1) 语法与使用位置的不同

缩短的Eval语法与Data Binder.Eval的不同点在于, Eval会根据最近的容器对象 (例如Data List Item) 的Data Item属性来自动地解析字段, 而Data Binder.Eval需要使用参数来指定容器。由于这个原因, Eval只能在数据绑定控件的模板中使用, 而不能用于Page (页面) 层。当数据绑定表达式是Eval ("数据库中某表的某个字段") 时, 必须把Text Box1这类服务器控件放在某个循环显示的控件的模板中才正确, 否则会提示:Eval () 、XPath () 和Bind () 这类数据绑定方法只能在数据绑定控件的上下文中使用。其实就是要把Text Box1放在像Repeater, Data List, Grid View这样的控件的模板中。

Eval方法是静态单向绑定方法, 所以Eval函数用于单向 (数据是只读的) 绑定。

Bind方法是双向绑定, 支持读/写功能, 所以Bind函数用于双向 (数据源可更改才能用) 绑定。该方法可以检索数据绑定控件的值, 并将任何更改返回服务器端提交回数据库, 服务器可以处理更改后的数据, 如存入数据库。

2) 绑定方法效率的不同

Eval方法执行时候会调用Data Binder.Eval方法, 一般使用较多的是Data Binder类的Eval方法。Data Binder.Eval方法在运行时使用反射reflection执行后期绑定计算, 开销比较大, 这样对于同时要绑定大量的数据效率要低一些, 会导致性能明显下降。所以三者中<%# ( (Data Row View) Container.Data Item) ["字段名"]%>的性能最好。

3) 一些错误用法

经常看到初学者把Data Binder.Eval (Container.Data Item, "Name") 和Container.Data Item ("Name") 视为同等, 其实Data Binder是System.Web里面的一个静态类, 而Container则根本不是任何一个静态的对象或方法, 它是ASP.NET页面编译器在数据绑定事件处理程序内部声明的局部变量, 其类型是可以进行数据绑定的控件的数据容器类型 (如在Repeater内部的数据绑定容器叫Repeater Item) , 在这些容器类中基本都有Data Item属性, 因此可以写Container.Data Item, 这个属性返回的是正在被绑定的数据源中的那个数据项。如果数据源是Data Table, 则这个数据项的类型实际是Data Row View。

通常情况下我们可以看到的后台代码都执行完毕后再去到前台代码中进行赋值绑定, 而<%#...%>是在Data Bind () 方法之后被调用, 一旦调用了Data Bind () , 则它对应的控件将绑定变量, 因此, 请注意:如果在Data Bind () 后再修改变量, 那么绑定的就不是最新值了, 页面就变成需要刷新才能看到期望的结果, 这就需要在完成变量的赋值后, 再去Data Bind () 。

以上总结对比了各种数据绑定的特点与适用范围, 对一些错误用法进行了澄清, 希望读者就此对Asp.Net数据绑定技术不再困惑。

参考文献

[1]文东, 秦敬祥.ASP.NET程序设计基础与项目实训[M].北京:中国人民大学出版社, 北京科海电子出版社, 2009.

[2]东名, 吴明月.ASP.NET动态网页设计高手[M].北京:清华大学出版社, 2001.

数据绑定 篇5

关键词:VS2005,C#,XML,TreeView

1 引言

TreeView控件是程序显示界面制作中最常用的控件之一,同样XML作为最流行的数据存储方式之一,在编程中的应用也日益广泛。如何将XML数据显示到TreeView控件中就成为在编程中经常遇到的问题。文中将介绍一种比较简单方法来解决这个问题。

TreeView控件的操作是基于TreeNode节点对象的,XML与之类似,只不过节点对象是XmlNode,所以把XmlNode节点对象转换成TreeNode节点对象即是解决问题的基础。在转换过程中采用递归算法来解决树结构的遍历问题。

TreeView控件可在节点前加CheckBox控件,但并不支持点击TreeNode节点文本时选中CheckBox,这就需要在程序中添加对mouseClick事件的响应。

在允许多选的情况下,获取所有被选中的项时也需要采用递归算法来遍历整个树结构。

2 程序实例

2.1 XML文件内容

2.2 读取XML数据及调用

2.3 绑定treeView

2.4 递归转换节点类型

2.5 点击TreeNode文本时选中CheckBox

2.6 获取所有被选中节点的ID

2.7 节点文本的修改

3 运行结果

如图1所示。

4 结语

通过程序实例介绍了XML数据绑定到TreeView控件的方法、鼠标单击事件及多选情况下被选中节点的获取方法。在实际应用中可能会遇到节点增加、删除等操作,有兴趣的读者可进一步研究。

数据绑定 篇6

计量封印产品主要用于电能计量装置上进行加封[1], 防止未授权的人员非法开启计量装置, 达到防窍电的目的。为满足电力企业防止封印被伪造, 以及在使用上对其实施规范化、信息化、智能化管理的要求, 封印产品上通常设置有激光打印的字符编码、条码等防伪特征, 而且每个封印产品在生产出厂前均须将防伪信息读取、录入封印管理系统中。为增强防伪性能, 某些型号的封印产品具有两种防伪特征 (如图1所示) , 在正面采用条码防伪特征, 在侧面采用字符编码防伪特征, 产品在包装盒中的情况如图2所示。以往对此产品两种防伪信息的识别、录入工作主要采用人工方式, 由工人目检包装盒中的产品侧面字符编码是否与封印管理系统中预设的数据相符;然后, 人工逐个拿出产品用手持条码扫描器识别条码信息输入管理系统中。由此可见, 该项检测、数据绑定录入工作的效率相当低下, 而市场上还没有这方面的自动化检测装置, 因此, 有必要研制封印产品字符编码与条码数据绑定系统。

本项目研究综合应用机械设计、机器视觉检测与自动化控制技术, 开发出一种封印产品字符编码与条码数据绑定系统。采用机器视觉检测技术对产品字符编码及条码进行自动识别, 开发了基于PLC控制的自动化检测夹具, 应用虚拟仪器开发平台Lab VIEW完成检测系统的软件开发。实践证明, 该系统的应用实现了封印产品两种防伪特征的自动化检测与数据绑定录入, 大大提高了此项检测工序的自动化水平和工作效率。

1 系统检测夹具设计

如图1所示, 封印产品的两种防伪特征位于不同位置上, 由图2可知, 产品在包装盒中只能呈现出所有侧面字符编码, 而正面的防伪条码由于产品之间的相互遮挡, 无法呈现。因此, 必须设计出一种新型的自动化检测夹具, 使产品放置于检测夹具上能在两个不同方向上自动呈现出两种防伪特征, 通过在两个方向上建立分布式机器视觉检测系统, 可以实现对产品字符编码和条码两种防伪特征的图像采集、检测。

本项目设计的自动化检测夹具应用情况如图3所示, 将产品放置于检测夹具上, 所有产品侧面呈平整状态 (如图3 (a) 所示) , 在产品垂直上方设置有机器视觉装置, 可以对产品侧面的所有字符编码进行图像采集。检测夹具可以在PLC控制下向上运动, 前后位置不同的封印产品运动上升的距离不同, 这样就使产品能够自动错开摆放, 从而使产品所有的条码特征同时呈现 (如图3 (b) 所示) , 在产品条码正前方设置有另一个机器视觉装置, 可以对产品正面的所有条码进行图像采集。两次检测采集的图像分别传输入软件系统中处理, 将检测结果进行数据绑定再自动录入封印管理系统中。

2 系统检测流程

系统检测流程如图4所示, 将封印产品放入检测夹具中, 利用光电检测技术探测到产品存在, 由PLC控制器产生视觉装置1的外触发信号, 触发相机采集到所有封印产品侧面编码的图像输入计算机中, 软件系统中的字符编码检测程序进行图像处理、分析, 得到字符编码识别结果, 并检验产品是否按照编码顺序排列。字符编码检测合格后, 计算机软件系统通过Mod Bus协议与PLC控制器通信, 在PLC控制下使检测夹具向上升起, 呈现所有产品防伪条码, 然后产生视觉装置2的外触发信号, 采集产品的正面条码图像输入计算机中, 软件系统的条码检测程序进行图像处理、分析, 得到所有条码的识别结果, 并检测产品是否按条码顺序排列。如果两次检测均合格, 则将产品上的字符编码与条码进行数据绑定, 采用UDP通信方式输入封印管理系统中, 然后PLC控制夹具下降, 检测系统复位到待机状态, 将合格品包装出货。在检测中, 如果出现字符编码、条码的识别错误, 或者产品顺序检验错误, 则系统产生报警信号, 并在操作界面上显示出错位置, 检测系统复位待机, 将不合品剔出处理。

3 系统检测原理

检测系统以虚拟仪器Lab VIEW为开发平台, 运用Ni Vision development module工具包辅助完成封印产品字符编码及条码的识别、数据绑定软件程序 (软件界面如图5所示) 。

3.1 字符编码检测

字符编码检测应用了机器视觉OCR技术, 其原理和主要流程如下:

1) 首先通过自学习训练建立封印产品字符编码模板库, 在项目中, 根据字符在图像分割时呈现的特征, 针对每个字符建立多模板[2], 以增强模板匹配识别的适应性。

2) 根据封印产品在检测夹具上的位置设定包含字符与背景的ROI (感兴趣区域) , 并保存于计算机硬盘中, 检测时由程序自动调用。

3) 对采集到的字符编码图像进行图像滤波、图像增强处理;软件程序按照设定的ROI顺序分别调用所有产品字符编码的ROI信息, 采用局部最大方差法进行字符图像二值化分割, 二值化后字符外存在孤立的噪声点, 图像的模糊也造成字符边缘产生噪声, 因此应用形态学腐蚀运算进行处理, 以消除孤立噪声点及边缘噪声。

4) 将二值化分割后的字符图像与模板库中的图像进行匹配运算, 根据运算结果, 待识别的字符被认为与相似度得分最高的模板一致;将各个字符编码识别结果存入字符识别数组中。

5) 检验字符识别数组中字符编码数据是否按顺序排列, 若是则合格, 进入下一步条码检测;反之, 则作为不合格品剔出, 系统复位等待下一个产品的检测。

3.2 条码检测

条码检测应用了机器视觉条码识别技术, 其原理和主要流程如下:

1) 根据产品在夹具上的位置设定所有待识别条码的ROI, 并保存在计算机硬盘中, 检测时由程序自动调用。

2) 检测前在软件中设定待检产品的条码类型, 有一维码 (code 128) 、二维码 (PDF417、QR code、Data Matrix) 等四种类型选择。

3) 对采集到的条码图像进行图像滤波、图像增强处理;软件程序按照设定的ROI顺序分别调用所有产品条码的ROI信息, 以及调用条码图像识别函数, 完成所有条码信息的读取, 结果存入条码识别数组中。

4) 检验条码识别数组中条码数据是否按顺序排列, 若是则合格, 进入下一步数据绑定录入环节;反之, 则属于不合格品, PLC控制夹具下降及将产品剔出, 系统复位等待下一个产品检测。

3.2 数据绑定录入

在Lab VIEW开发环境中完成数据绑定录入程序的编程, 源程序子VI如图6所示。字符编码与条码的识别结果分别存放在两个独立的数组中, 条码识别成功后, 将两个数组中相同位置的元素均提取出来, 组合成新的数组元素, 从而形成数据绑定数组。以UDP协议方式将绑定的字符编码和条码数据传输入封印管理系统, 按照系统输入数据的格式要求设置好正确的格式, 然后调用UDP通信函数发送数据, 并与封印管理系统中预设的数据进行比对校验。

4 系统检测实验

从封印产品的两种防伪特征来看, 其字符编码均是具有10位字符的相似印刷体, 而条码类型则有四种:一维码 (code 128) 、二维码 (PDF417、QR code、Data Matrix) , 根据条码类型的不同, 在生产过程中各抽取1000盒产品应用于检测系统进行数据绑定试验。结果如表1所示, 检测成功率达到99.8%以上, 而且该工序的工作效率比以往提升了超过200%。出现识别错误的情况均为将良品误判为不良品;由于字符编码及条码的识别结果均需进行顺序检验, 而且输入管理系统后还要进行二次校验, 因此, 出现将不良品误判为良品的可能性为零。实验证明, 该数据绑定系统达到了应用于大批量自动化生产的要求。

5 结束语

本文针对封印产品字符编码及条码防伪特征自动化绑定、录入的需求, 研究开发了基于机器视觉的封印产品字符编码与条码数据绑定系统。设计出一种新型的自动化检测夹具, 可以在PLC控制下自动呈现产品的两种防伪特征;应用机器视觉检测技术对产品字符编码及条码进行自动化识别和顺序检验, 并将识别数据绑定录入封印管理系统。该数据绑定系统适用于封印产品行业大批量生产时对产品防伪特征进行自动化检测与数据绑定, 改变了以往过多依赖人工操作的落后现状。目前, 该系统已在江门市大光明电力设备厂有限公司使用了超过1年时间, 促进企业实施了生产线技术升级、改造, 提高了生产的自动化水平及生产效率。

参考文献

[1]何志强, 徐二强, 丁涛, 等.关于实现电能表铅封自动化的研究[J].电测与仪表, 2011, 48 (12) :83.

[2]吴伟伟, 王小红, 周亚南.字符识别中两种改进的模板匹配算法[J].传感器世界, 2008, (6) :35-37.

数据绑定 篇7

做ASP.NET项目时,都会碰到报表问题。报表作为一种信息组织和分析的有利手段,是企业信息系统的重要组成部分。在信息管理系统开发中,如何开发出既满足用户需求,又能减少开发人员工作量的报表是开发人员普遍面临的问题。水晶报表是由Crystal Decisions公司开发的商务智能软件,是一款优秀的专业报表开发和制作工具,Crystal Reports for Visual Studio.NET是以Crystal Reports 9.0为蓝本,专门为.NET平台定制的,提供了丰富的编程模型,充分利用.NET Framework和CRL(Common Runtime Library,公共运行库),大大降低了大型的企业级报表开发过程的复杂度,同时它使用开放而灵活的结构,其标准类似XML(Extensible Markup Language,可扩展标记语言),可通过Web共享报表与信息,可提供深化图表、报表导航和文本搜索等功能。

Web应用程序员一直都在寻求多行数据与交互图形关联的自动化(或半自动化)方法来构造适于网上发布的数据访问,超强的数据动态显示功能以及丰富的交互功能是Web程序员制作动态报表的一大挑战,.NET为这种需求提供了最为简便的利器——数据绑定控件。数据绑定控件将控件及其单个属性与支持.NET的任意数据源中的一个或多个字段相关联,结合各种交互图形,生成多样式的报表,并通过提供多种函数实现对其控制。但数据绑定控件对动态改变的数据源,难以做到实时改变显示内容和交互方式,更达不到自动化绑定的程度。

本文在功能强大的水晶报表中和.NET开发环境下,针对动态改变的数据源,采用面向对象思想,提出了一种水晶报表数据源动态绑定新方法,在运行时根据对象的实际情况来选择绑定类成员,通过编码来动态指定报表、报表数据源及参数。

2. 水晶报表及数据绑定实现

2.1 水晶报表

Crystal Reports可根据关系型数据库、OLAP(On-Line Analytical Processing,联机分析处理)、XML或者其它自定义的数据源设计出灵活的、丰富的报表。Crystal Reports For.net已经作为报表标准,集成在Microsoft Visual Studio.net中,应用它可以创建、集成和查看报表并将之整合为应用程序的一部分。VS.Net水晶报表快速的报表开发能够动态地将报表导出成为.pdf、.doc、.xls、.html、.rtf等多种格式。通过服务器端水晶报表引擎(Crystal Report Engine(CREngine.dll)可以完成一些任务,如在报告文件中合并数据,转换报告为其它格式等。也正是因为报告引擎的作用,才可以将Asp.Net中的水晶报表转换成为普通HTML格式。

2.2 水晶报表数据绑定

水晶报表绑定数据的模式有很多种,其中包括使用Data Set、Data Reader及Object Collection控件等。在某个特定的系统项目中,我们多数通过指定的业务数据库来提供对报表数据的支持。在Microsoft Visual Stdio 2005中的水晶报表也可以用推模式动态绑定数据源;也可以使用数据绑定控件Crystal Report Source,这个控件与Sql Data Source数据源绑定控件一起连用就可以用SQL表达式作数据源推数据了。

水晶报表获取数据可以使用下面的方法实现:

在拉模型中,驱动程序将连接到数据库并根据需要将数据“拉”进来。使用这种模型时,与数据库的连接和为了获取数据而执行的SQL命令都同时由Crystal Reports本身处理,不需要开发人员编写代码。如果在运行时无须编写任何特殊代码,则使用拉模型。

推模型需要开发人员编写代码以连接到数据库,执行SQL命令以创建与报表中的字段匹配的记录集或数据集,并且将该对象传递给报表。该方法使您可以将连接共享置入应用程序中,并在Crystal Reports收到数据之前先将数据筛选出来。

3. 基于C#水晶报表数据源动态绑定的实现

采用面向对象方法,创建一个窗体类,用来实现报表打印,在这个类中具有水晶报表数据成员Report Document,当打印不同水晶报表时,将要打印的水晶报表赋值给ReportDocument,然后通过设置数据源及参数,完成水晶报表数据源的动态绑定,灵活性高。下面给出实现过程。在项目(项目名称为testapplication)中按如下步骤执行。

(1)创建一个窗体frmprintinput;窗体中的控件及属性设置如表1。

(2)设计一个类querydatabase,该类具有方法query Sql实现对指定表或视图查询出满足条件的记录。

class querydatabase

{

//tabelname为表或视图名称,where Str为要查询的条件。

public static Data Set query Sql(string tabelname,string whereStr)

{

Sql Connection con=DB.connection();

Data Set ds=new Data Set();

Sql Command cmd=new Sql Command("SELECT*FROM

"+tabelname+"where"+where Str,con);

Sql Data Adapter da=new Sql Data Adapter(cmd);

da.Fill(ds,"table");

return ds;

}

}

(3)在项目中创建文件夹report,创建项目所需的水晶报表并保存到report文件夹中;

(4)在需要打印水晶报表(假设水晶报表名为Crystal Report1.rpt)的窗体添加Button控件Button1,并编写该控件的click事件代码如下:

private void button1_Click(object sender,Event Args e)

{

frmprintinput frmpt=new frmprintinput();

frmpt.report Document1=new testapplication.Report.Crystal Report1();

string str=“查询条件”;frmpt.report Document1.

SetDataSource(querydatabase.query Sql("表名或视图名",str).Tables["table"]);

frmpt.report Document1.Set Parameter Value("报表参数名",实参数据值);

frmpt.crystal Report Viewer1.Report Source=frmpt.reportDocument1;

frmpt.Show Dialog();

}

4. 结束语

VS.NET开发环境下,水晶报表是一个优秀的报表开发工具,在开发WEB服务中,它更显现出简单、易用,功能强大的特点。本文所提出水晶报表数据源的动态绑定技术,使所要打印的多个报表可共用窗体类,在运行时根据对象的实际情况来选择绑定类成员。通过编码来动态指定报表,报表数据源及参数,在实际应用中操作性、强灵活性好。

参考文献

[1]钟崴,许晓敏,童永光.动态绑定技术的研究与应用[J].计算机工程,2000,26(9):81-83.

[2]邹光宗.水晶报表Crystal Reports XI中文版标准教材[M].北京:电子工业出版社,2005.

[3]周萍.基于C#的动态水晶报表交叉表实现成绩单[J].考试周刊,2007,49:112-113.

当手机绑定学生话费之后…… 篇8

自2010年起,山东省某学院每年新生入学时都会给每一位新生发一部手机,里面带有200元费用,学生入学时补交。这部手机其实并不是一般的手机,学生在校期间出入校门,到食堂就餐,到图书馆借阅书籍,上校园网学习等都必须要使用这部手机。按理说这应该是一件方便学生的好事,可是学生们却一直不太领情。为什么会这样呢?据同学们反映,手机信号不好,还常会出现其它故障。有的同学还反映,有时手机没电就没法吃饭了。既然给同学们造成这么多不便,那就干脆取缔这种手机一卡通的管理方式就是了。不过,事情远没有这么简单。据记者调查,每位同学,不管你每个月打不打电话都必须缴纳39元话费,而且是直接通过手机扣除。这所学校共有约13000名学生,每年的话费总额巨大。又据记者调查,这所学校与当地电讯部门已签订了协议。协议规定:所得话费收入双方分成获取收益。具体按怎样的比例来分成,记者不得而知。

学校如此进行一卡通管理,如此精细地为学生的学习、生活服务,实则是有见不得阳光的猫腻的。

说实话,刚看到对这件事的报道时,笔者十分激愤,一时竟不知该说点什么才好。但是,仅仅是激愤就能解决好问题吗?我想,还是要谈几点看法,希望能够引起社会的关注,尤其是教育人的重视和反思。

第一,学校应该是讲究诚信的地方。常言道:人生一世,德为根本。这个“德”,有很大一部分就应该是诚信。学校是什么地方?没什么异议,显然是教书树人的地方。树人要树什么?首位的当是树德。树德当树什么?显然很重要的就在于树立诚信品格。然而,少数学校(像报道中的那所学校)明明是为了赚取学生钱财,却不惜采取不诚信的欺骗手段。表面上看,管理是到位了,关心和服务是精细又周到了,但这管理、关心和服务背后却是失信、欺骗,牟取钱财。这样的管理和服务行为,其最危害学生的地方其实并不仅仅在于学生按月“被付话费”,更在于这种不诚信的欺骗行为竟被美化和合法化了。这样一来,学校就自觉不自觉地培育了一种育人氛围,即有意无意地教学生学会用类似的手段去谋取利益。说起这种不诚信行为,在当下的各级各类校园简直就形成了一种“文化”。例如,学生社会实践活动造假,学生就业率造假,学校科研成果造假等。实话实说,这些“造假”行为的确都有其种种复杂原因,致使这些“造假”行为也就都常态化地存在着。尽管如此,学校该是最诚信的地方,应该尽可能地独洁己身,绝不可忽视一些所谓的“常态”对孩子们心灵的污染。

第二,学校应该是讲究法治的地方。《消费者权益保护法》明文规定:消费者有权自主选择商品或服务的权利。然而,有些学校甚至上级行政管理部门为了牟取部门(有时也是个人的)利益, 却无视学生意愿,违背法律法规,强制学生统一订教辅资料、做校服、缴话费等。当然,有些“统一”在特定的情况下也许是必要的,如统一订购教辅资料、订做校服等,只要不是为了利益而以次充好。但是统一买作业本、假期补课、缴话费等,一般都是以谋取部门(或个人) 利益为取向的,往往是只问金钱而不顾学生意愿,统统应该纳入违禁之列,坚决杜绝。否则,这种只认金钱而不惜违法的校园环境,很有可能就把一些学生都熏染成视法纪为个人发展障碍,谋取私利而不择手段的人。

第三,学校应该是清正公平的地方。这个“清”,应该理解为清廉、清明, 这个“正”应该理解为正道、公正。学校应该处处体现民主、文明、和谐、自由、平等、公正,人人追求敬业、诚信、友善、奉献等。人民教育家陶行知早曾说过: “千教万教教人学真,千学万学学做真人”。说得通俗一点,真正的学校就都是通过教育实践来让孩子们学会做真人的地方,即让孩子们学习和做事中去自主体验、感受、思辨、感悟和提升,为他们以后的工作、生活打下基础。为此,学校的领导和教师必须人人做到“清正”, 学校的教育教学必须时刻渗透“清正”, 学校的文化环境必须处处培育“清正”。然而,在改革开放的新形势下,在金钱和利益面前,我们的一些学校不“清正”了,一些领导和教师不“清正”了,导致育人环境不“清正”了。这绝对是极为有害的。

上一篇:发展等级下一篇:积极感受