《C#程序设计基础教程》课件第10章.ppt

上传人(卖家):momomo 文档编号:7648077 上传时间:2024-05-19 格式:PPT 页数:67 大小:795.50KB
下载 相关 举报
《C#程序设计基础教程》课件第10章.ppt_第1页
第1页 / 共67页
《C#程序设计基础教程》课件第10章.ppt_第2页
第2页 / 共67页
《C#程序设计基础教程》课件第10章.ppt_第3页
第3页 / 共67页
《C#程序设计基础教程》课件第10章.ppt_第4页
第4页 / 共67页
《C#程序设计基础教程》课件第10章.ppt_第5页
第5页 / 共67页
点击查看更多>>
资源描述

1、第10章 ADO.NET(三)第10章 ADO.NET(三)10.1 DataSet10.2 架构的生成架构的生成10.3 List泛型集合泛型集合10.4 数据展示数据展示10.5 查看电影信息查看电影信息第10章 ADO.NET(三)10.1 DataSet第10章 ADO.NET(三)数据集(DataSet)是ADO.NET的一个重要组成部分,它是数据的脱机容器,承担着数据的中间存储工作。DataSet并不直接和数据库连接,因此它的数据不一定来源于数据库,而是可以有很多种不同的来源,甚至可以直接从测量设备中读取。一个DataSet是由一组数据表(DataTable)对象组成的,而每个Da

2、taTable对象又是由若干个DataColumn对象和DataRow对象组成的,如图10-1所示。我们可以看到其结构和数据库中的数据表非常相似。除了定义数据外,还可以在DataSet中定义表之间的链接,即我们在数据库中常用的到主/从表。DataSet及其常用对象的说明如表10-1所示。第10章 ADO.NET(三)我们可以直接通过构造来创建DataSet对象:DataSet ds=new DataSet();DataSet ds=new DataSet(myds);上面我们分别采用DataSet的两个构造来创建对象,两种方式没有太大的区别,只不过第二种方式DataSet对象多了一个“myds

3、”的别称而已。和数据库一样,DataSet对象本身并不能够存储数据,真正承担这个工作的是DataTable对象,接下来我们来了解DataTable对象。第10章 ADO.NET(三)数据表(DataTable)非常类似于SQL Server 2008中的数据库表,它是由一组包含特定属性的列组成的,可能包含0行或多行数据。和数据库表一样,DataTable也可以定义由一个列或者多个列组成的主键,列上也可以包含约束。这些信息对应的通用术语称为DataTable的“架构”。整个DataTable可以访问的对象如图10-2所示。在C#中,创建DataTable对象可以有两种方式:DataTable d

4、t1=new DataTable();DataTable dt2=new DataTable(myTab);两种方式没有本质上的区别,只不过dt2对象在具体使用时会更加方便一些。当然现在DataTable对象依然无法存储数据,因为它还没有结构,要设定DataTable的结构,我们需要用到DataColumn对象。第10章 ADO.NET(三)10.2 架构的生成架构的生成第10章 ADO.NET(三)在ADO.NET中,DataAdapter(数据适配器)的作用是检索和保存数据,在使用的过程中它一般都是与Connection对象和Command对象一起使用,以便连接到相应的数据库并完成指定的操

5、作。另一方面,DataAdapter对象本身并不具备保存数据的能力,因此它又需要和DataSet对象配合使用,才能够临时存储数据,并提供操作数据的接口。DataAdapter无疑是ADO.NET中一个非常特殊的对象,它就像一座桥梁,一头连接着存储数据的数据库,另一头则连接着作为临时数据存储对象的DataSet。它能够根据SQL语句从数据库中提取数据,也能够将更改后的数据更新到数据库中。DataAdapter对象属于.NET Framework数据提供程序,不同的数据提供程序有自己的DataAdapter对象,用于OLE DB的是OleDbDataAdapter对象,而用于SQL Server的

6、是SqlDataAdapter对象,这里我们以SqlDataAdapter对象为例来认识DataAdapter对象。我们可通过四种方式来创建SqlDataAdapter对象,如表10-4所示。第10章 ADO.NET(三)一般来说第三种方式使用得比较多:string conn=ConfigurationManager.ConnectionStringsSQL.ConnectionString;SqlConnection cn=new SqlConnection(conn);string sql=select*from Film;SqlDataAdapter da=new SqlDataAdap

7、ter(sql,cn);在上面的代码中我们首先还是要创建一个SqlConnection对象,因为在ADO.NET中一切操作都是以连接为基础,然后创建一个SqlDataReader对象,并且将一个Select查询语句和已经创建好的SqlConnection对象作为参数传递到它的构造函数中。创建了SqlDataAdapter对象后,我们就可以使用其提供的属性和方法来完成需要的操作。我们常用到的方法有两个:Fill():使用SELECT语句从数据源中检索数据。Update():使用SQL语句将数据集中的数据更新到数据源。当我们需要从数据库中检索数据时,可以使用Fill()方法,这时与Select命令

8、关联的SqlConnection 对象必须有效,但不需要将其打开。如果调用Fill()方法之前SqlConnection已关闭,则将其打开以检索数据,然后再将其关闭。如果调用Fill()方法之前连接已打开,则它将保持打开状态:第10章 ADO.NET(三)string sql=select*from User;SqlDataAdapter da=new SqlDataAdapter(sql,cn);DataSet ds=new DataSet();da.Fill(ds);在上面的代码中我们创建了一个SqlDataAdapter对象,并且通过一条查询语句从数据库中查询数据,然后将结果使用Fill

9、()方法填充到一个数据集对象中。如果在填充数据时遇到错误或异常,则错误发生之前添加的行将保留在数据集中,操作的剩余部分被中止。如果命令不返回任何行,则不向数据集中添加表,也不引发异常。在实际应用中,DataAdapter对象多用于查询类型的操作,虽然它也具有其他类型数据操作的能力,但是由于其本身缺乏对数据完整性的验证能力,因此其他类型的操作我们多是借助于Command对象来完成的。在大部分程序中,数据集在使用的时候都是通过DataAdapter对象来填充的。通过DataAdapter对象的Fill()方法,我们可以将数据源中的数据一次性地填充到数据集中,这个时候数据集的结构和内容都由系统帮助我

10、们自动生成。填充数据集有多种不同的方式,最直接的方式是不做任何设定,一切由系统来决定:string conn=ConfigurationManager.ConnectionStringsSQL.ConnectionString;SqlConnection cn=new SqlConnection(conn);第10章 ADO.NET(三)string sql=select*from Film;SqlDataAdapter da=new SqlDataAdapter(sql,cn);DataSet ds=new DataSet();da.Fill(ds);上面的代码我们没有做任何其他的设置,仅仅

11、是连接数据库后读取Film数据表中的所有数据,然后通过DataAdapter对象的Fill()方法将读取的数据填充到一个数据集中。因为我们只提供了一些对象,所以这个时候数据集中将由系统自动创建一个名为“Table”的DataTable对象,而它的结构则由我们的查询语句来决定。例如,我们这里是查询Film表中的所有信息,因此“Table”表的字段就是数据库中Film数据表的所有字段,而“Table”表的数据则和Film数据表的数据一样。后续我们使用这个数据集的时候就只能这样访问DataTable:ds.TableTable或者通过索引访问:ds.Table0很显然,上面的代码虽然能够完成任务,但

12、是不确定和不安全的地方太多了,因此我们还需要将程序写得更加准确些:第10章 ADO.NET(三)SqlDataAdapter da=new SqlDataAdapter(sql,cn);da.Fill(ds,MyFilm);这一次我们将程序做了一点微调,在调用DataAdapter对象的Fill()方法时,我们不但传递了数据集对象,同时还给了第二个字符串类型的参数“MyFilm”,这个参数的作用是在进行数据填充的时候,将系统自动创建的DataTable对象命名为“MyFilm”,这样在后续使用时就可以这样写:ds.TableMyFilm相对第一段代码,这次的程序显得更加精确,但是依然存在问题,

13、主要是访问起来比较麻烦,每次都要通过数据集定位到DataTable,然后才能够访问行和列,因此我们可以将程序再次进行修改:SqlDataAdapter da=new SqlDataAdapter(sql,cn);DataTable dt=new DataTable();da.Fill(dt);这次程序中找不到DataSet对象了,取而代之的是一个DataTable对象,这也是我们在实际开发中经常会用到的一种方式,道理很简单,既然数据集的数据是存放在DataTable对象中的,那我们就可以绕过数据集而直接使用DataTable对象来操作数据,当然这样一来我们就无法再通过数据集来管理DataTab

14、le之间的关系了。三种数据集填充方式在实际使用的过程中没有太大的区别,具体采用哪种方式还是要根据实际开发的情况以及个人的使用习惯来定。第10章 ADO.NET(三)10.3 List泛型集合泛型集合第10章 ADO.NET(三)10.3.1 List定义集合的具体介绍详见C#高级编程的有关教材,下面要介绍的是集合中用得非常广泛的一种:List。我们首先来看一下它的语法:List list=new List();这是一个泛型集合类,重点在于它里面的类型参数:T。T本身没有具体含义,它只是类似于占位符一般的存在。它可以是任何类,如果你想创建一个User实体对象的集合,那么,将T改成User就行了。

15、在实际运用中,语法如下:List list=new List();10.3.2 数据读取光有对象是不够的,List的作用是获取数据库中的数据,作为数据源来使用。但是如何将数据表中的数据放到List对象中呢?下面的代码是整个过程。首先,创建表的实体类,我们要将用户表(User)的数据读取出来,先创建User类:public class User /属性定义 public int ID get;set;第10章 ADO.NET(三)public string Name get;set;public string UserName get;set;public int TypeID get;set;

16、public string TypeName get;set;public string Desc get;set;public int State get;set;接下来,使用SqlDataReader对象读取数据:string conStr=server=.;initial catalog=MyFilm;integrated security=SSPI;string sql=select*from User;SqlConnection conn=new SqlConnection(conStr);conn.Open();SqlCommand cm=new SqlCommand(sql,co

17、nn);SqlDataReader dr=cm.ExecuteReader();List modelList=new List();/创建List泛型集合对象第10章 ADO.NET(三)User model=null;/在循环外部创建User对象,但不用实例化while(dr.Read()model=new User();/每一次循环读取数据时,实例化该对象model.ID=int.Parse(drID.ToString();/将当前行的ID字段数据赋值给对象ID属性model.Name=drName.ToString();model.UserName=drName.ToString();m

18、odel.TypeID=int.Parse(drTypeID.ToString();model.TypeName=drName.ToString();model.Desc=drName.ToString();model.State=int.Parse(drState.ToString();modelList.Add(model);/最后一定要记得将实体对象添加到集合中第10章 ADO.NET(三)dr.Close();/一定要记得在读取完数据后关掉阅读器conn.Close();当执行完上述操作后,这个集合中就获得了查询语句所查询出来的所有数据了。第10章 ADO.NET(三)10.4 数据展

19、示数据展示第10章 ADO.NET(三)10.4.1 简单控件对于DataSet来说,最直接的操作就是用简单控件来显示其中的数据,当然在这之前我们要知道如何读取它的值。最常见的就是读取DataSet中数据表的某行或者某列的值,甚至可能会精确到某一个单元格的值。例如,用户希望查看数据表中第二部电影的信息,那么我们的程序就可以这样写:string name=(string)ds.TablesFilm.Rows1Name;string addedBy=(string)ds.TablesFilm.Rows1AddedBy;string actor=(string)ds.TablesFilm.Rows1

20、Actors;string desc=(string)ds.TablesFilm.Rows1Desc;MessageBox.Show(影片+name+是由+actor+主演!ny影片简介:+desc);上面的代码可以访问表中的一行数据,如果需要访问表中所有行的数据,则需要再增加一个循环结构:foreach(DataRow dr in ds.TablesmyTab.Rows)/读取数据第10章 ADO.NET(三)事实上,如果是这种逐行读取数据的操作则DataReader对象是更加合适的对象,因为它消耗的系统资源更少,速度也更快一些。DataSet的主要用途在于更全面地展示数据。知道了如何读取数

21、据后,接下来使用简单控件呈现数据的工作就很简单了:txtName.Text=(string)ds.TablesFilm.Rows0Name;txtActors.Text=(string)ds.TablesFilm.Rows0Actors;txtPrice.Text=ds.TablesFilm.Rows0Price.ToString();txtDesc.Text=(string)ds.TablesFilm.Rows0Desc;上面的代码依然是从数据集中读取数据,只不过读取的数据不再使用变量,而是直接使用三个TextBox控件和一个RichTextBox控件来呈现数据。只不过这种方式只能够读取一行

22、数据,如果需要一次性展示更多的信息则还需要借助于其他的控件。我们曾用DataSet来读取数据,那么List是怎么读取数据的呢?同样的案例,我们用泛型集合来演示一次。假设读取数据的泛型集合类为List,对象名称为modelList,同样读取第二行数据:string name=modelList1.Name;string addedBy=modelList1.AddedBy;其余的值依此类推,可见相比较DataSet来讲,List要简单方便。第10章 ADO.NET(三)想要读取所有的数据,也可以用循环遍历来实现:foreach(Film model in modelList)/依上例读取数据st

23、ring name=model.Name;控件的数据读取依上例所示即可。10.4.2 列表控件列表类型的控件是系统开发过程中经常会用到的控件,在之前我们用到这类控件的时候,其选择项大多是直接设定好的固定内容,是否可以让它们从数据集中动态地获取选择内容呢?要实现这个操作本身并不复杂,我们知道列表类型的控件其选择项都是在Items属性中保存的,因此只要能够将数据集中的数据“放置”到Items属性中就可以了。问题在于Items属性中的每一个选择项都是由Text和Value这两个值构成的,因此我们要做的工作就是将数据表的列和这两个值对应起来:comboBox1.DropDownStyle=ComboB

24、oxStyle.DropDownList;第10章 ADO.NET(三)comboBox1.DisplayMember=Name;comboBox1.ValueMember=ID;comboBox1.DataSource=ds.TablesFilm;在上面的代码中我们设定了ComboBox控件的四个属性。DropDownStyle属性用来设定其显示方式,我们设定为ComboBoxStyle.DropDownList,这样该组合框控件就只能够选择而不能够输入信息。DisplayMember属性用来设定每一个Item选择项的Text属性所对应的列名,这个列名必须是数据表中存在的列。ValueMem

25、ber属性则是用来设定每一个Item选择项的Value属性所对应的列名,同样该列必须是数据表中存在的列,如果在程序中没有设定ValueMember属性,则Item选择项的Value属性值就会和Text属性值相同。最后我们设定了组合框控件的DataSource属性,也就是数据源属性,这样系统就会自动在DataSource所指定的数据源中查找相应的列,并将这些列的值一次性填充到组合框中,从而形成选择项。同样,上例也用的是DataSet数据源,如果是List集合,则只需要把最后一句代码的数据源替换即可:comboBox1.DataSource=modelList;/第10章 ADO.NET(三)记住

26、,这里的值为整个泛型集合对象从这里开始,后面的数据源将直接使用泛型集合,而不再使用DataSet了。如何知道用户所选择的内容呢?这里我们可以通过两个简单的属性取得用户选择的信息:int id=(int)comboBox1.SelectedValue;string name=comboBox1.Text;MessageBox.Show(电影+name+的编号是:+id);组合框的SelectedValue属性可以取得用户选择项的Value属性值,而Text属性则可以取得用户选择项的Text属性的值。这里很容易产生一个疑问:为什么一个选择项要设定Text和Value这两个属性值?这是因为在实际使用

27、中,难免会出现重复的数据。例如,如果数据库中存在两部同名的电影,那么我们如何知道用户选择的究竟是哪一部电影呢?很显然单凭Text属性根本无法做判断,这时候如果我们在Value属性中保存了电影的编号,那么就可以很容易地知道用户的选择。因为之前的数据是通过属性绑定到控件的,我们通过上面的内容可以得到显示和隐藏的值,但实际上我们可以通过它的SelectedItem属性得到当前选定项所绑定的整个对象:Film model=(Film)comboBox1.SelectedItem;第10章 ADO.NET(三)MessageBox.Show(电影+model.Name+的编号是:+model.Id);如

28、果是多选我们该如何操作呢?对于像ListBox这样的多选类型的控件,其数据显示部分的操作和ComboBox控件一样,也就是说我们将前面代码中的ComboBox换成ListBox控件就可以了:listBox1.SelectionMode=SelectionMode.MultiExtended;listBox1.DisplayMember=Name;listBox1.ValueMember=ID;listBox1.DataSource=modelList;相对于ComboBox控件ListBox控件的读取相对来说复杂一些,根据DataSource所设定的数据源类型不同,其读取方式也会有一些细微的差

29、别,其读取方式为string str=选中的电影:;for(int i=0;i listBox1.SelectedItems.Count;i+)Film model=(Film)listBox1.SelectedItemsi;str+=n电影名称:+model.Name;/如果能读取到Name,则其他的属性也能够得到MessageBox.Show(str);上面代码的运行效果如图10-5所示。第10章 ADO.NET(三)10.4.3 DataGridView列表类型的控件在使用的时候虽然能够一次性呈现很多行数据的信息,但是只能够显示数据表中的某一列,如果要呈现数据的全貌,还是要借助于更加大型

30、的控件,这其中最常用的就是DataGridView。DataGridView控件是WinForm中经常使用到的一个用于呈现数据的大型控件,它能够以表格的形式将数据集中的数据表完整地呈现出来,同时还支持根据用户的需要进行各种不同的设置。使用DataGridView控件时,可以在工具箱的“数据”选项卡中找到它并将其放置到窗体中,如图10-6所示。将DataGridView控件添加到窗体上后,我们只需要一行代码就可以将刚才创建的泛型集合在该控件上呈现出来:dataGridView1.DataSource=modelList;第10章 ADO.NET(三)DataGridView控件可以以表格的形式将

31、数据集中的数据呈现出来,该控件在使用的时候最重要的属性就是DataSource属性,它主要用来设置DataGridView控件数据源,在上面的代码中我们就将电影信息读取出来后放置在DataSet对象中并作为数据源赋给了该属性。其运行效果如图10-7所示。第10章 ADO.NET(三)当然,数据是出来了,但是和实际使用差别太大了,根本就不具备可用性。首先,我们并不需要将所有的字段都展示出来,像ID这样的字段根本就不需要用户知道它的存在。其次,列名用英文并没有问题,但是这里却使用的是字段名称,从而将我们的数据结构暴露了出来,这样甚至会威胁到整个系统的安全。事实上,上面的问题总结起来就是一点,即需要

32、DataGridView控件按照我们设定的方式显示数据,这就要设置DataGridView控件列,我们可以打开DataGridView控件的智能选项卡,然后点击“编辑列”来完成。第10章 ADO.NET(三)也可以在DataGridView控件的属性列表中来完成。无论采用哪种方式,我们都可以打开DataGridView控件的列编辑器,如图10-10所示。在列编辑器的左侧是一个列表框,这里列出了当前DataGridView控件中已经添加的列对象,我们可以看到这里有四个列。选中某一个列后,在窗体的右侧可以看到一个属性列表,这当中列出了当前选中列对象的一些常用属性。在这些属性中,常用的有以下几个:N

33、ame:列对象的名称,在程序中必须保证唯一。在命名时一般采用col作为前缀,例如colName。第10章 ADO.NET(三)ColumnType:类对象的类型。WinForm中DataGridView控件的列共有六种类型:按钮列样式(DataGridViewButtonColumn)、复选框列样式(DataGridViewCheckBoxColumn)、组合框列样式(DataGridViewComboBoxColumn)、图片列样式(DataGridViewImageColumn)、链接列样式(DataGridViewLinkColumn)和文本框列样式(DataGridTextBoxCol

34、umn,默认样式)。不同的列样式会呈现出不同的外观,同时使用方式也有细微的差别。DataPropertyName:设置列对象所对应的数据源字段名称。HeaderText:设置列对象的页眉文本。不同的列样式对应着不同的使用环境,具体需要采用什么样式还要根据实际情况来决定,一般情况下如果不能确定则都可以采用文本框样式来呈现数据,因为它基本上可以显示任何类型的数据。如果要添加新的列对象,则点击左侧列表框下的“添加”按钮,这样就可以打开添加列窗体。在这个窗体上,我们可以设置三个值。“名称(N):”用来指定新添加列对象的Name属性值。“类型(T):”下拉列表中可以选择新添加列对象的样式,也就是Colu

35、mnType属性值。“页眉文本(H):”则是用来设定新添加列的HeaderText属性值。需要注意的是,这里并没有设置DataPropertyName属性值,因此在完成列的添加后还需要在图10-10中找到新添加的列并设置DataPropertyName属性,否则是无法使用的。第10章 ADO.NET(三)列设置完成再次运行我们的程序,会发现凡是数据表我们设置过的字段都按要求在DataGridView控件的指定列当中呈现出来了,但是我们没有设置的字段却依然按照先前的样式显示在DataGridView控件中,如图10-12所示。这是因为默认情况下DataGridView控件会自动根据数据源中的表结

36、构来创建相应的列,也就是说数据表中有多少个字段,DataGridView控件就会自动创建多少个列,并显示数据,而我们这里却只需要它显示我们设置的列,其他的列就不需要再自动创建了。要实现这一效果我们可以通过下面的代码来实现:第10章 ADO.NET(三)dgdShowData.AutoGenerateColumns=false;AutoGenerateColumns属性的作用是用来设置DataGridView控件是否需要根据数据源来自动创建列,将其设置为false后系统就不会再自动创建列,而只会根据我们设置的列来呈现数据,如图10-13所示。DataGridView是WinForm中最为复杂的大

37、型控件之一,本章我们只是介绍了DataGridView控件的基本使用方式。第10章 ADO.NET(三)10.4.4 ListViewListView控件是另外一个数据展示控件,和DataGridView控件不同,ListView控件只是提供数据的显示功能而并不提供对数据的操作功能,但是其显示方式要比DataGridView控件丰富。下面我们同样使用ListView控件来显示电影信息。在工具箱中找到ListView控件并放置到窗体上,如图10-14所示。第10章 ADO.NET(三)和其他控件一样,ListView控件也有很多属性,限于篇幅我们不可能一次性将所有的属性及其使用方式讲解完毕,因此

38、本章我们还是围绕着数据呈现来学习相关的属性。为了能够完成这个任务,我们会用到ListView控件的以下属性:Name:ListView控件的名称,在代码中必须唯一。在命名的时候一般采用lsv作为前缀。Columns:设置ListView控件的列。FullRowSelect:指示是否可以一次性选择整行数据。GridLines:指示ListView在显示数据的时候是否显示网格线。View:设置ListView的显示方式。ListView控件中提供了五种不同的显示方式,如表10-6所示。第10章 ADO.NET(三)使用ListView控件显示数据要比使用DataGridView控件复杂一些。首先我

39、们需要设置ListView控件的Columns属性,也就是设置数据显示的列。在ListView控件的属性窗口的行为部分找到Columns属性。点击右侧的按钮后打开ColumnHeader集合编辑器窗体。在窗体的左侧“成员(M):”之下我们可以看到现在Columns属性所有已经存在的列成员。在成员列表的右侧有上下两个按钮,选中某列后点击向上或向下的按钮就可以调整该列的排列顺序,这个排列顺序决定了最终数据显示的时候该列的位置。如果未添加任何列,则该列表为空。点击成员列表下方的“添加(A)”按钮就可以添加一个新的列。在成员列表中选中某一列后,在窗体的右侧可以看到当前选中列对象的相关属性,在这些属性中

40、我们需要关注的是Name和Text。Name属性是当前选中列对象的名称,由于在实际操作过程中访问这些列对象时我们都采用的是下标访问,因此这里可以采用系统自动生成的名字,如果要命名,可以采用col作为前缀。Text属性则是用来设定列对象的页眉,也就是呈现在ListView控件中列标头的文本。设定完成后,点击“确定”按钮后关闭ColumnHeader集合编辑器窗体,接下来需要完成具体的数据显示工作。首先依然还是要将数据从数据库中读取出来,这个过程我们可以使用DataAdapter对象与DataSet对象配合起来实现,因为前面我们已经进行了讲解,这里就不再重复说明。由于ListView控件没有Dat

41、aGridView控件那样的自动数据填充功能,因此我们需要将数据集中的数据提取出来,然后放入ListView控件中的相应位置:第10章 ADO.NET(三)foreach(Film model in modelList)ListViewItem item=new ListViewItem();item.SubItems0.Text=model.Name;item.SubItems.Add(model.Actors);item.SubItems.Add(string.Format(0:C,model.Price);lsvShowData.Items.Add(item);在上面的代码中,我们首先通

42、过一个foreach循环结构遍历数据集合的所有行,在循环结构体中我们需要创建一个ListViewItem对象,该对象代表ListView控件的Items属性中的一个成员。接下来,我们就可以通过这个ListViewItem对象的SubItems属性将数据行中的数据放置到该对象中。ListViewItem对象每调用一次Add()方法就可以向其中添加一个新的单元格,唯一需要注意的是其第一个单元格需要通过下标访问,因为在创建该对象的时候系统会默认添加一个单元格。无论是设置哪一个单元格,传递的值都需要是字符串类型的。第10章 ADO.NET(三)那么,ListViewItem对象又是怎么和ListVie

43、w控件的列建立起关联的呢?事实上,这个过程并不复杂,在最终将ListViewItem对象通过Add()方法添加到ListView控件的Items属性中的时候,系统会按顺序将ListViewItem对象的单元格和ListView控件的列对应起来,也就是将ListViewItem对象第一个单元格的值放置到ListView控件的第一个列中,第二个单元格则放置到第二个列中,以此类推。正因为是这样一个操作过程,所以我们在为ListViewItem对象添加单元格的时候一定要对ListView控件的列组成牢记在心,否则就会出现数据放置错误。另外,如果ListViewItem对象的单元格数量多于ListVie

44、w控件的列数量,则多出来的数据就会被系统舍弃。上面的代码中另外一个需要我们注意的地方是,在添加价格的时候我们并没有直接将其转换成为字符串,而是通过string类的Format()方法将其转换成了货币的格式。Format()方法的作用是将指定的值按照要求转换成为特定的格式。一般在使用该方法时我们需要提供两个参数:第一个为字符串类型,用来设定转换的格式;第二个则是需要转换的数据或数据集合。每个格式项都采用下面的形式并包含以下组件:索引,对齐:格式字符串 第10章 ADO.NET(三)“索引”(也叫参数说明符)是一个从0开始的数字,用来标识需要转换的数据对象。也就是说,当索引为0时,其对应需要转换的

45、第一个数据对象,如果索引为1,则对应第二个数据对象,依次类推,我们可以把它理解成为占位符。通过指定相同的索引,多个格式项可以引用转换数据对象列表中的同一个元素。每个索引都可以引用要转换数据对象列表中的任一对象。例如,如果有三个要转换的数据对象,则可以通过指定类似于“1 0 2”的复合格式字符串来设置第二、第一和第三个对象的格式。格式项未引用的对象会被忽略。如果索引指定了超出数据对象列表范围的项,将导致运行时异常:第10章 ADO.NET(三)txtFormat.Text=string.Format(货币:0:C;百分比:1:P;十六进制:0:X,12,0.35);上面的代码分别将数字12转换成

46、为货币格式和十六进制数,而将0.35转换成为百分比。“对齐”是可选的一个带符号的整数,指示设置了格式的字段宽度。如果“对齐”值小于设置了格式的字符串的长度,则“对齐”会被忽略,并且使用设置了格式的字符串的长度作为字段宽度。如果“对齐”为正数,则字段中设置了格式的数据为右对齐;如果“对齐”为负数,则字段中设置了格式的数据为左对齐。如果需要填充,则使用空白。如果指定“对齐”,就需要使用逗号:txtFormat.Text=string.Format(右对齐:0,10;左对齐:0,-10;对齐失效:0,2,Tom);同样是将Tom进行格式化,当我们使用“0,10”这种格式的时候,转换的结果就是在Tom

47、的前面增加7个空格以补齐10位长度,而使用“0,-10”时,则会在其后面添加7个空格以补齐10位长度。但是在“0,2”中,对齐的数值小于“Tom”的长度,因此“对齐”就失效了。格式字符串则是用来设定需要设定的转换格式,表10-7列出了常用的格式字符串。第10章 ADO.NET(三)10.4.5 TreeView在WinForm中TreeView控件用树的方式展示层次节点,通过这些节点,我们可以清晰地查看数据及其它们之间的从属关系。传统上,节点对象包含值,可以引用其他节点,一个节点可以包含其他节点,这时该节点称为父节点,它所包含的节点称为子节点。只有子节点没有父节点的节点称为根节点,在WinFo

48、rm中TreeView控件可以包含多个根节点,如图10-21所示。第10章 ADO.NET(三)作为所有节点的管理者,TreeView控件本身的常用属性并不多,如表10-8所示。第10章 ADO.NET(三)TreeNode是TreeView控件的重要组成部分,在WinForm中TreeView控件的每一个节点都是一个TreeNode类的实例,每一个TreeNode对象又都具有Nodes属性来设置和管理它的子节点,TreeNode对象的常用属性如表10-9所示。对于TreeView控件来说,最为重要的就是对其中包含的节点进行相关的操作和管理,因此对TreeView的应用主要就集中在添加节点、取

49、得选中的节点以及用户选中节点后的操作等几个方面。为TreeView控件添加节点的方式有两种。首先,我们可以通过WinForm中的TreeNode编辑器在图形界面中完成节点的设置,将TreeView控件添加到窗体中后找到其Nodes属性,点击后打开TreeNode编辑器。第10章 ADO.NET(三)在打开的TreeNode编辑器左侧的“选择要编辑的节点(N):”下方,我们可以看到当前TreeView控件中已经添加的所有节点及其层次结构,选中其中的某一个节点,可以在窗体右侧“节点X的属性(P):”下方看到当前选中节点的常用属性,如图10-23所示。在节点列表的下方,我们可以看到两个按钮。“添加根

50、(R)”按钮的作用是为TreeView控件添加一个根节点。而“添加子级(C)”按钮则可以为当前选中节点添加子节点。在节点第10章 ADO.NET(三)列表的右侧,自上而下分别是上移按钮、下移按钮和删除按钮。当我们选中某个节点后点击上移按钮,该节点就会向上移动;如果点击下移按钮,那么该节点就会向下移动;点击删除按钮就可以删除该节点及其子节点。通过这几个按钮我们就可以根据需要设计出完整的TreeView控件。使用代码方式添加节点需要先创建TreeNode对象,然后通过调用Add()方法,将其添加到相应节点的Nodes属性中:TreeNode tn1=new TreeNode(根节点1);trvFi

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《C#程序设计基础教程》课件第10章.ppt)为本站会员(momomo)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|