用Delphi或者VB编程,在对数据库中的记录进行操作的时候,经常用到一个名称为数据导航器的组件,通过这个组件,可以非常方便的实现对已经绑定到此组件的数据表中的记录进行浏览。就是所谓的上一条记录、下一条记录、首记录、尾记录等。那么在Visual C#是否也存在这样的组件呢?答案是否定的。但由于Visual C#有着强大的数据库处理能力,所以可以比较方便的做一个类似于此组件的程序。本文就是来介绍此程序的具体制作过程。
一、 程序的主要功能介绍: 
程序打开本地Acess数据库(sample.mdb)中的book数据表,然后把book数据表中的 
字段绑定到程序提供的文本框中,显示出来。通过程序中的四个按钮"首记录"、"尾记录"、"上一条"、"下一条",实现对book数据表中的记录浏览。程序的运行界面如下: 
图01:对数据表中记录浏览程序的运行界面
二、程序设计和运行的环境设置: 
(1)视窗2000服务器版 
(2)Microsoft Acess Data Component 2.6 ( MADC 2.6 ) 
三、程序设计难点和应该注意的问题: 
(1)如何实现把数据表中的字段用文本框来显示: 
如果直接把字段的值赋值给文本框,这时如果用"下一条"等按钮来浏览数据记录的时候,文本框的值是不会变化的。如何让文本框根据数据表中的记录指针来动态的显示要字段值,这是本文的一个重点,也是一个难点。 
本文是通过把数据表中的字段值绑定到文本框的"Text"属性上,来实现动态显示字段数值的。实现这种处理要用到文本框的DataBindings属性和其中的Add方法。具体语法如下: 
文本组件名称.DataBindings.Add ( "Text" , DataSet对象 , 数据表和字段名称 ) ; 
在程序具体如下: 
t_bookid.DataBindings.Add ( "Text" , myDataSet , "books.bookid" ) ; 
这样就可以根据记录指针来实现要显示的字段值了。 
(2)如何改变记录指针: 
只有掌握如何改变记录指针,才可以随心所欲的浏览记录。Visual C#改变记录指针是通过一个命叫BindingManagerBase对象来实现的。此对象封装在名称空间System.Windows.Froms中。BindingManagerBase对象是一个抽象的对象,管理所有绑定的同类的数据源和数据成员。在程序设计中主要用到BindingManagerBase对象中的二个属性,即:Position属性和Count属性。第一个属性是记录了数据集的当前指针,后一个属性是当前数据集中的记录总数。由此可以得到改变记录指针的四个按钮对应的程序代码: 
i>.首记录: 
myBind.Position = 0 ; 
ii>.尾记录: 
myBind.Position = myBind.Count - 1 ; 
iii>.下一条记录和操作后运行界面: 
if ( myBind.Position == myBind.Count -1 ) 
MessageBox.Show ( "已经到了最后一条记录!" ) ; 
else 
myBind.Position += 1 ; 
iV>.上一条记录和操作后运行界面: 
if ( myBind.Position == 0 ) 
MessageBox.Show ( "已经到了第一条记录!" ) ; 
else 
myBind.Position -= 1 ; 
四.程序源代码: 
using System ; 
using System.Drawing ; 
using System.ComponentModel ; 
using System.Windows.Forms ; 
using System.Data.OleDb ; 
using System.Data ; 
public class DataView : Form { 
private System.ComponentModel.Container components ; 
private Button lastrec ; 
private Button nextrec ; 
private Button previousrec ; 
private Button firstrec ; 
private TextBox t_books ; 
private TextBox t_bookprice ; 
private TextBox t_bookauthor ; 
private TextBox t_booktitle ; 
private TextBox t_bookid ; 
private Label l_books ; 
private Label l_bookprice ; 
private Label l_bookauthor ; 
private Label l_booktitle ; 
private Label l_bookid ; 
private Label label1 ; 
private System.Data.DataSet myDataSet ; 
private BindingManagerBase myBind ; 
public DataView ( ) 
{ 
//连接到一个数据库 
GetConnected ( ) ; 
// 对窗体中所需要的内容进行初始化 
InitializeComponent ( ,',','); 
} 
public override void Dispose ( ) { 
base.Dispose ( ) ; 
components.Dispose ( ) ; 
} 
public static void Main ( ) { 
Application.Run ( new DataView ( ) ) ; 
} 
public void GetConnected ( ) 
{ 
try{ 
//创建一个 OleDbConnection 
string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = sample.mdb" ; 
OleDbConnection myConn = new OleDbConnection ( strCon ) ; 
string strCom = " SELECT * FROM books " ; 
//创建一个 DataSet 
myDataSet = new DataSet ( ) ; 
myConn.Open ( ) ; 
//用 OleDbDataAdapter 得到一个数据集 
OleDbDataAdapter myCommand = new OleDbDataAdapter ( strCom , myConn ) ; 
//把Dataset绑定books数据表 
myCommand.Fill ( myDataSet , "books" ) ; 
//关闭此OleDbConnection 
myConn.Close ( ) ; 
} 
catch ( Exception e ) 
{ 
MessageBox.Show ( "连接错误! " + e.ToString ( ) , "错误" ) ; 
} 
} 
private void InitializeComponent ( ) 
{ 
this.components = new System.ComponentModel.Container ( ) ; 
this.t_bookid = new TextBox ( ) ; 
this.nextrec = new Button ( ) ; 
this.lastrec = new Button ( ) ; 
this.l_bookid = new Label ( ) ; 
this.t_books = new TextBox ( ) ; 
this.t_booktitle = new TextBox ( ) ; 
this.t_bookprice = new TextBox ( ) ; 
this.firstrec = new Button ( ) ; 
this.l_booktitle = new Label ( ) ; 
this.l_bookprice = new Label ( ) ; 
this.l_books = new Label ( ) ; 
this.previousrec = new Button ( ) ; 
this.l_bookauthor = new Label ( ) ; 
this.t_bookauthor = new TextBox ( ) ; 
this.label1 = new Label ( ) ; 
//以下是对数据浏览的四个按钮进行初始化 
firstrec.Location = new System.Drawing.Point ( 55 , 312 ) ; 
firstrec.ForeColor = System.Drawing.Color.Black ; 
firstrec.Size = new System.Drawing.Size ( 40 , 24 ) ; 
firstrec.TabIndex = 5 ; 
firstrec.Font = new System.Drawing.Font("仿宋", 8f ,',','); 
firstrec.Text = "首记录"; 
firstrec.Click += new System.EventHandler(GoFirst,',','); 
previousrec.Location = new System.Drawing.Point ( 125 , 312 ) ; 
previousrec.ForeColor = System.Drawing.Color.Black ; 
previousrec.Size = new System.Drawing.Size(40, 24) ; 
previousrec.TabIndex = 6 ; 
previousrec.Font = new System.Drawing.Font ( "仿宋" , 8f ) ; 
previousrec.Text = "上一条" ; 
previousrec.Click += new System.EventHandler ( GoPrevious ) ; 
nextrec.Location = new System.Drawing.Point ( 195 , 312 ,',','); 
nextrec.ForeColor = System.Drawing.Color.Black ; 
nextrec.Size = new System.Drawing.Size ( 40 , 24 ) ; 
nextrec.TabIndex = 7 ; 
nextrec.Font = new System.Drawing.Font ( "仿宋" , 8f ) ; 
nextrec.Text = "下一条" ; 
nextrec.Click += new System.EventHandler ( GoNext ,',','); 
lastrec.Location = new System.Drawing.Point ( 265 , 312 ) ; 
lastrec.ForeColor = System.Drawing.Color.Black ; 
lastrec.Size = new System.Drawing.Size ( 40 , 24 ) ; 
lastrec.TabIndex = 8 ; 
lastrec.Font = new System.Drawing.Font ( "仿宋" , 8f ) ; 
lastrec.Text = "尾记录" ; 
lastrec.Click += new System.EventHandler ( GoLast ) ; 
//以下是对为显示数据记录而设定的标签和文本框进行初始化,并把记录绑定在不同的绑定到文本框"Text"属性上 
t_bookid.Location = new System.Drawing.Point ( 184 , 56 ) ; 
t_bookid.TabIndex = 9 ; 
t_bookid.Size = new System.Drawing.Size ( 80 , 20 ) ; 
t_bookid.DataBindings.Add ( "Text" , myDataSet , "books.bookid" ) ; 
t_books.Location = new System.Drawing.Point ( 184 , 264 ) ; 
t_books.TabIndex = 10 ; 
t_books.Size = new System.Drawing.Size ( 80 , 20 ) ; 
t_books.DataBindings.Add ( "Text" , myDataSet , "books.bookstock" ) ; 
t_booktitle.Location = new System.Drawing.Point ( 184 , 108 ) ; 
t_booktitle.TabIndex = 11 ; 
t_booktitle.Size = new System.Drawing.Size ( 176 , 20 ) ; 
t_booktitle.DataBindings.Add( "Text" , myDataSet , "books.booktitle" ) ; 
t_bookprice.Location = new System.Drawing.Point ( 184 , 212 ) ; 
t_bookprice.TabIndex = 12 ; 
t_bookprice.Size = new System.Drawing.Size ( 80 , 20 ) ; 
t_bookprice.DataBindings.Add ( "Text" , myDataSet , "books.bookprice" ) ; 
t_bookauthor.Location = new System.Drawing.Point ( 184 , 160 ) ; 
t_bookauthor.TabIndex = 18 ; 
t_bookauthor.Size = new System.Drawing.Size ( 128 , 20 ) ; 
t_bookauthor.DataBindings.Add ( "Text" , myDataSet , "books.bookauthor" ) ; 
l_bookid.Location = new System.Drawing.Point ( 24 , 56 ) ; 
l_bookid.Text = "书本序号:" ; 
l_bookid.Size = new System.Drawing.Size ( 112, 20 ) ; 
l_bookid.Font = new System.Drawing.Font ( "仿宋" , 10f ) ; 
l_bookid.TabIndex = 13 ; 
l_bookid.TextAlign = System.Drawing.ContentAlignment.MiddleCenter ; 
l_booktitle.Location = new System.Drawing.Point ( 24 , 108 ) ; 
l_booktitle.Text = "书 名:"; 
l_booktitle.Size = new System.Drawing.Size ( 112 , 20 ) ; 
l_booktitle.Font = new System.Drawing.Font ( "仿宋" , 10f ) ; 
l_booktitle.TabIndex = 14 ; 
l_booktitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter ; 
l_bookprice.Location = new System.Drawing.Point ( 24 , 212 ) ; 
l_bookprice.Text = "价 格:" ; 
l_bookprice.Size = new System.Drawing.Size ( 112 , 20 ) ; 
l_bookprice.Font = new System.Drawing.Font ( "仿宋" , 10f ) ; 
l_bookprice.TabIndex = 15 ; 
l_bookprice.TextAlign = System.Drawing.ContentAlignment.MiddleCenter ; 
l_books.Location = new System.Drawing.Point ( 24 , 264 ) ; 
l_books.Text = "书 架 号:" ; 
l_books.Size = new System.Drawing.Size ( 112 , 20 ) ; 
l_books.Font = new System.Drawing.Font ( "仿宋" , 10f ) ; 
l_books.TabIndex = 16 ; 
l_books.TextAlign = System.Drawing.ContentAlignment.MiddleCenter ; 
l_bookauthor.Location = new System.Drawing.Point ( 24 , 160 ) ; 
l_bookauthor.Text = "作 者:" ; 
l_bookauthor.Size = new System.Drawing.Size ( 112 , 20 ) ; 
l_bookauthor.Font = new System.Drawing.Font ( "仿宋" , 10f ) ; 
l_bookauthor.TabIndex = 17 ; 
l_bookauthor.TextAlign = System.Drawing.ContentAlignment.MiddleCenter ; 
label1.Location = new System.Drawing.Point ( 49 , 8 ) ; 
label1.Text = "浏览书籍信息" ; 
label1.Size = new System.Drawing.Size ( 296 , 24 ) ; 
label1.ForeColor = System.Drawing.Color.Green ; 
label1.Font = new System.Drawing.Font ( "仿宋" , 15f ) ; 
label1.TabIndex = 19 ; 
//对窗体进行设定 
this.Text = "用C#做浏览数据库中记录的程序!"; 
this.AutoScaleBaseSize = new System.Drawing.Size ( 5 , 13 ) ; 
this.FormBorderStyle = FormBorderStyle.FixedSingle ; 
this.ClientSize = new System.Drawing.Size ( 394 , 375 ) ; 
//在窗体中加入组件 
this.Controls.Add ( lastrec ) ; 
this.Controls.Add ( nextrec ) ; 
this.Controls.Add ( previousrec ) ; 
this.Controls.Add ( firstrec ) ; 
this.Controls.Add ( t_books ) ; 
this.Controls.Add ( t_bookprice ) ; 
this.Controls.Add ( t_bookauthor ) ; 
this.Controls.Add ( t_booktitle ) ; 
this.Controls.Add ( t_bookid ) ; 
this.Controls.Add ( l_books ) ; 
this.Controls.Add ( l_bookprice ) ; 
this.Controls.Add ( l_bookauthor ) ; 
this.Controls.Add ( l_booktitle ) ; 
this.Controls.Add ( l_bookid ) ; 
this.Controls.Add ( label1 ) ; 
//把对象DataSet和"books"数据表绑定到此myBind对象 
myBind= this.BindingContext [ myDataSet , "books" ] ; 
} 
//按钮"尾记录"对象事件程序 
protected void GoLast ( object sender , System.EventArgs e ) 
{ 
myBind.Position = myBind.Count - 1 ; 
} 
//按钮"下一条"对象事件程序 
protected void GoNext ( object sender , System.EventArgs e ) 
{ 
if ( myBind.Position == myBind.Count -1 ) 
MessageBox.Show ( "已经到了最后一条记录!" ) ; 
else 
myBind.Position += 1 ; 
} 
//按钮"上一条"对象事件程序 
protected void GoPrevious ( object sender , System.EventArgs e ) 
{ 
if ( myBind.Position == 0 ) 
MessageBox.Show ( "已经到了第一条记录!" ) ; 
else 
myBind.Position -= 1 ; 
} 
//按钮"首记录"对象事件程序 
protected void GoFirst ( object sender , System.EventArgs e ) 
{ 
myBind.Position = 0 ; 
} 
} 
五.总结: 
本文的重点就在于如何用Visual C#改变数据集的记录指针和如何让文本框根据记录指针的变化而改变显示内容。虽然此类处理在Visual C#比起用其他语言要显得麻烦些。但对于程序设计人员却更灵活了,使得程序设计人员有了更大的发展空间。 

