第九章、Windows应用程序(9.17节~9.20节:Timer、TreeView、ListView、DataGridView)

9.17、定时器Timer

9.17.1System.Windows.Forms.Timer

9.17.1.1、属性

Name:唯一标识该控件的属性,在程序中就是通过该属性来调用控件的。

Interval:触发Tick事件的频率,每隔Interval毫秒触发一次Tick事件。

Enabledtrue表示该定时器正常,false表示定时器失效。该属性默认为false,当设置为true的时候,相当于timer1.Start(),设置为false的时候,相当于timer1.Stop()

9.17.1.2、函数

            timer1.Start();//启动定时器

            timer1.Stop();//停止定时器

9.17.1.3、事件

timer1.Tick += new System.EventHandler(this.timer1_Tick);   

定时器启动后,不会立马触发事件,而是开始计时,当时间到达间隔大小之后,会触发唯一Tick事件;然后又开始计时,等待着下一次的间隔结束后继续执行事件。

   private void timer1_Tick(object sender, EventArgs e)

        {

        }

9.17.2System.Timers.Timer

9.17.1.1、初始化对象

定义一个对象:System.Timers.Timer t = new System.Timers.Timer();

指定一个事件:t.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Tick);

设定时间间隔:t.Interval = 5000;

9.17.1.2、属性

Enabledtrue表示该定时器正常,false表示定时器失效。该属性默认为false。当设置为true的时候,相当于timer1.Start(),设置为false的时候,相当于timer1.Stop()

AutoReset:获取或设置一个值,该值指示Timer是应在每次指定的间隔结束时引发 Elapsed 事件,还是仅在指定的间隔第一次结束后引发该事件。设置是执行一次(false)还是一直执行(true)

Enabledtrue表示该定时器正常,false表示定时器失效。该属性默认为false,当设置为true的时候,相当于timer1.Start(),设置为false的时候,相当于timer1.Stop()

9.17.1.3、函数

timer1.Start();//启动定时器,触发事件

timer1.Stop();//停止定时器,不触发事件

timer1.Close();//停止定时器,不触发事件,并且释放timer1所占用的资源,但是timer1对象还是存在的,没有被释放。

9.17.1.4、事件

         private void timer1_Tick (object source, System.Timers.ElapsedEventArgs e)

         {

            

}

定时器启动后,不会立马触发事件,而是开始计时,当时间到达间隔大小之后,会触发唯一Tick事件;然后又开始计时,等待着下一次的间隔结束后继续执行事件。

9.18、TreeView

9.18.1TreeViewTreeNode 的定义    

这个是一个树形控件,定义该控件:

TreeView  treeView1  =  new  TreeView();

      为了使该控件的节点能够设置图像,那么还需要定义一个图像列表,该图像列表中包含了一些图像,这些图像是有整数索引值的:

ImageList  imageList1  =  new  ImageList();

将树形控件的ImageList属性设置成上面定义好的图像列表:

treeView1.ImageList  =  imageList1

该控件是由节点构成的,该控件的所有节点都是TreeNode类型。定义一个节点:

TreeNode  node  =  new  TreeNode();

9.18.2TreeNode节点的属性

Node.Name:该属性表示该节点的名字,可读写,而且同一个TreeView上面的不同节点的该属性是可以相同的,不会有什么错误,因为这个属性并不是唯一标识某一个节点的。

node.Text该节点显示出来的文本值,可读写。

node.Tag该属性是object类型的,可以记录与该节点相关的一些值。

node.ImageIndex正常情况下未被选中时的所显示的图像的索引。

node.SelectedImageIndex被选中时的所显示的图像的索引。

注意:以上两个属性值是通过imageList1来设置的,就是图像的索引;如果希望某一个节点选中和不选中两种情况下都显示相同的图像,那么可以将这两个属性值设置成相同即可。

node.Nodes获取该节点的子结点的集合。

node.Parent获取该节点的父节点,如果没有父节点就返回null

node.FirstNode获取该节点的子结点集合中的第一个子结点,如果该节点没有子结点,那么返回null

node.LastNode获取该节点的子结点集合中的最后一个子结点,如果该节点没有子结点,那么返回null

node.NextNode获取该节点同级的下一个节点,如果该节点同级没有下一个节点,那么返回null

node.PrevNode获取该节点同级的上一个节点,如果该节点同级没有上一个节点,那么返回null

node.FullPath获取从根节点到当前节点完整路径,每个节点用Text属性替代,节点之间用“\”分隔。

node.Checked获取或者设置该节点是否被选中,这个是在有CheckBox的情况下使用的。

node.IsExpanded该属性表示该节点是否处于可展开状态,即是否处于闭合状态。只读。

node.IsSelected:该属性表示该节点是否处于选中状态,只读。

9.18.3TreeNode节点的方法

node.Remove()将该节点及其子结点全部移除。

node.Expand():展开树节点。

node.ExpandAll():展开所有子树节点。

node.Collapse:折叠该树节点。

9.18.4Nodes的属性和方法

TreeView TreeNode都有Nodes集合,该集合常用属性和方法:

Nodes.Count表示该节点集合中的节点的个数。 

Nodes.Add(node):treeView1TreeNode的下一级子结点的集合中添加节点。

Nodes.Clear():将当前对象的Nodes节点集合清除。

注意:treview1的根节点可以有多个,往treview1.nodes里面添加多个,就会有多个根节点;treview1.nodes或者TreeNode.Nodes子结点的集合都是指当前对象的下一级,而不是下两级或者所有级。

9.18.5TreeView的属性和方法

treeView1.SelectedNodetreeView1中选中的节点。如果treeView1刚被加载了一些节点初始化了,没有设定其选中的节点,那么默认是选中根节点的;如果手动的选中了一个节点,那么该属性就是选中的节点;如果在程序中把手动选中的节点删除了,那么有默认根节点为选中节点了;如果此时再用程序新增一个节点,那么就不选中任何节点了,该属性为null

TreeView的事件:

选择某个节点之后就会触发该事件,其中e.Node表示当前选中的节点:

        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)

        {

            textBox1.Text = e.Node.Text;

        }

9.19、列表视图ListView

列表视图是一个容器,可以存放数据:

9.19.1、属性

Name:唯一标识该控件的属性,在程序中就是通过该属性来调用控件的。

View:该控件的显示风格,有5种显示风格,但是如果要想显示表格的话,就必须把该属性设置成:Details

GridLines:在各个单元格周围是否显示网格线。

FullRowSelect:控制当某一个单元格被选中时,该行的其他单元格是否与该单元格一起整行突出显示,如果为false则即使选中也没什么效果。

HideSelection:当控件没有焦点,是否移除选定项的突出显示。

HeaderStyle:控制标题头是否可以点击触发事件。

MultiSelect:控制列表视图是否允许多选。如果设置成可以多选,那么可以用:

Ctrl + 鼠标点      击、Shift +鼠标点击、 Shift +上下键

Enabled:控制该控件是否可用。

Columns:列表框的列ColumnHeader的集合。

Items集合:列表框的行ListViewItem的集合。

集合的Conut属性:可以用Count属性来获得集合的ListViewItem元素个数: listView1.Items.Count

还可以用索引来取得单个行ListViewItem listView1.Items[int index],这个索引index的范围是从0listView1.Items.Count 1,越界就出错。

还可以通过Index求出某个ListViewItem行在整个列表框中的索引:

listView1.Items[0].Index

ListViewItem还有一个Selected属性,可以设置或者读取该值,表示该项是否被选定。

SelectedItems集合:列表框的选中的行ListViewItem的集合。如果把选中项删除一个或者若干个,那么在删除的过程中,SelectedItems.Count是会动态改变的。

选中项集合的Conut属性:可以用Count属性来获得选中项集合的ListViewItem元素个数: listView1.Items.Count

还可以用索引来取得单个行ListViewItemlistView1.SelectedItems [int index],这个索引index的范围是从0listView1. SelectedItems.Count 1,越界就出错。

CheckBoxes:当把该属性设置为true的时候,每一行前面都会出现一个CheckBox

此时如果选中 CheckBox就有一个选中项的集合:CheckedItems

9.19.2、函数

listView1.Items.Add(ListViewItem)------往列表框结合中添加元素。

listView1.Items.RemoveAt(int index)------删除元素,索引必须在0到listView1.Items.Count 1,越界就出错。

listView1.Items.Clear();--------清空所有的元素。

ListViewItem.Remove()-----------删除单个的ListViewItem元素。

 

9.19.3、事件

        private void listView1_Click (object sender, EventArgs e)

        {

            ListViewItem lvi = listView1.FocusedItem;

            MessageBox.Show(lvi.Text);

        }

在click事件中,可以通过listView1.FocusedItem来获得点击的那一项,如果选择了多个,那么该项是最后一次点击选择的项。但是click不支持上下键。

        private void listView1_MouseDoubleClick(object sender,MouseEventArgs e)

        {

            ListViewItem lvi = listView1.FocusedItem;

            MessageBox.Show(lvi.Text);

            或者

            ListViewItem lvi = listView1.GetItemAt(e.X, e.Y);

            MessageBox.Show(lvi.Text);

    }

鼠标双击事件里面可以用listView1.FocusedItem或者listView1.GetItemAt(e.X, e.Y)来引用选中的项。

 

        private void listView1_SelectedIndexChanged(object sender,EventArgs e)

        {

            ListViewItem lvi = listView1.FocusedItem;

            MessageBox.Show(lvi.Text);

    }

当选择的索引发生变化的时候,触发,选择索引发生变化可以通过Shift +鼠标点击、 Shift + 上下键,当用Ctrl + 鼠标点击的时候,如果先点击了,然后按住ctrl再点级别的就会出错。正因为有这个缺陷,所以一般不用这个事件。(如果只能选择一个,那么点击了一个后再点击另外一个也会出问题)。

 

ListView主要有两种使用方式,第一种是没有CheckBox的:

1、先要把View属性设置成:listView1.View =View.Details;

2、把GridLines属性设置成:listView1.GridLines =true;

3FullRowSelect设置成:listView1.FullRowSelect =true;

4HideSelection设置成:listView1.HideSelection =false;

5HeaderStyle设置成:listView1.HeaderStyle = ColumnHeaderStyle.Nonclickable;

6、定义列头:列头是按照顺序依次增加的,既可以在属性窗口Columns集合中添加,也可以用下面的代码添加。

            ColumnHeader ch = new ColumnHeader();

            ch.Width = 60;

            ch.Text = "hello";

            listView1.Columns.Add(ch);

7、添加该控件的行ListViewItem

ListViewItem li = new ListViewItem();

li.Text = "该行的第一列";//第一列必须以这种方式添加。

li.SubItems.Add("该行的第二列"); //参数是字符串,该单元格显示的值,这种SubItems的添加是从第二列开始的。

li.SubItems.Add("该行的第三列");//依次往后面添加列

listView1.Items.Add(li); //最后要将ListViewItem对象添加到listView的Items集合中,如果要添加多行的话,就要按照顺序来添加ListViewItem对象,显示也会按照添加的顺序来显示。

 

8、删除该控件的选中的行ListViewItem

       如果只选中一行:

                ListViewItem li = listView1.SelectedItems[0];

                li.Remove();或者listView1.Items.RemoveAt(li.Index);

如果选中多行:把选中项删除一个或者若干个,那么在删除的过程中,SelectedItems.Count是会动态改变的。

                         for (; 0 != listView1.SelectedItems.Count; )

                     {

                           listView1.SelectedItems[0].Remove();

                       }

或者

            foreach (ListViewItem lviin listView1.SelectedItems)

            {

                lvi.Remove();

               

            }

8、清空该控件的所有行ListViewItem

listView1.Items.Clear();--------清空所有的元素。

listView1.SelectedItems.Clear();--只是让那些选择了的变成不选择,而不会删除这些行。

 

9、读写ListViewItem中的某个单元格的值

ListViewItem lvi = listView1.SelectedItems[0];

string c1 = lvi.SubItems[0].Text; 等价于string c1 = lvi.Text;

string c2 = lvi.SubItems[1].Text;

string c3 = lvi.SubItems[2].Text;

也可以对以上列写入数据。

 

10、第二种是有CheckBox的,当把CheckBoxes属性设置为true的时候,每一行前面都会出现一个CheckBox。此时如果选中 CheckBox就有一个选中项的集合:CheckedItems ,CheckedItems集合有CheckedItems.Count属性,也会随着选中项的删除而不停的变化。可以通过CheckedItems[int index]来取得某一行,index的范围是从0CheckedItems.Count – 1的。

11、可以将该控件的SmallImageList属性设置成某个图片列表对象,然后将ListViewItem

ImageIndex属性设置好,就可以在某个ListViewItem行显示出图片了。

9.20、DataGridView

       这个是一个网格控件,主要是用来绑定数据的。

9.20.1、属性

9.20.1.1、布局类的属性

AutoSizeColumnsMode:该属性指示如何确定表格的列宽:

DataGridViewAutoSizeColumnsMode.AllCells:列宽调整到适合列中所有单元格的内容(包含列头单元格)。

DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader:列宽调整到适合除列头以外的列中所有单元格的内容,即以列中的单元格内容为标准,如果内容比列头短,那么列头就会显示不完全。

DataGridViewAutoSizeColumnsMode.ColumnHeader:列宽调整到适合列头中的内容,即以列头为主如果列的内容单元格长度超过了列头的宽度,那么就会显示不全。

DataGridViewAutoSizeColumnsMode.DisplayedCells:列宽调整到适合当前显示的行的列中所有单元格的内容(包含列头单元格)。

DataGridViewAutoSizeColumnsMode.DisplayedCellsExceptHeader:列宽调整到适合当前显示的行的列中所有单元格的内容(不包含列头单元格)。

注意:以上的值都是可能出水平现滚动条的,而且列宽是不能被用户在UI上手动的改变的。哪怕属性AllowUserToResizeColumns是true。

DataGridViewAutoSizeColumnsMode.Fill:让列宽填充整个DataGridView表格的宽度,列宽的加和只能等于表格的宽度。如果列内容或者列头的宽度比表格的宽度大也不会有滚动条,只会让列的某些内容显示不全,但是列宽可以被用户在UI上手动的改变的。只要在一个列的属性上设置成为Fill,就能达到该效果。

DataGridViewAutoSizeColumnsMode.None:列宽不会自动的去调整,只会按照列的属性设置的宽度。如果列内容或者列头的宽度比表格的宽度大会有滚动条,列宽可以被用户在UI上手动的改变的。

该属性小结:这个属性设置之后,该控件的所有的列都会按照设置的属性去确定列宽,这个是对整体的所有列进行设置。但是如果不设置这个属性,而是在列集合属性窗口中去对单个列进行设置,那么影响的只会是那单个的列。

AutoSizeRowsMode:该属性指示如何确定表格的行高:

DataGridViewAutoSizeRowsMode.AllCells:将行高调整到适合行中的所有单元格的高度(包括行头)。

DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders:将行高调整到适合行中的内容单元格的高度。

DataGridViewAutoSizeRowsMode.AllHeaders:将行高调整到适合行中的行头单元格的高度。

DataGridViewAutoSizeRowsMode.DisplayedCells:将行高调整到适合屏幕上当前显示的行中的所有单元格的高度(包括行头)。

DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders:将行高调整到适合屏幕上当前显示的行中的内容单元格的高度。

DataGridViewAutoSizeRowsMode.DisplayedHeaders:将行高调整到适合屏幕上当前显示的行中的行头单元格的高度。

注意:以上的值都是可能出现垂直滚动条的,而且行高是不能被用户在UI上手动的改变的。哪怕属性AllowUserToResizeRows是true。

DataGridViewAutoSizeRowsMode.None:行高不自动调整。

注意:以上的值是可能出现垂直滚动条的,而且行高是可以被用户在UI上手动的改变的。只要属性AllowUserToResizeRows是true。

Location:该属性指示控件左上角相当于它的容器的左上角的坐标。

RowHeadersWidth:自带的行标题那一列的宽度。

ScrollBars:滚动条设置:

ScrollBars.Horizontal:只显示水平滚动条。

ScrollBars.Vertical:只显示垂直滚动条。

ScrollBars.None:两个滚动条都不显示。

ScrollBars.Both:同时显示水平和垂直滚动条。

Size:该属性指示控件的高度和宽度。

9.20.1.2、设计类的属性

Name:该属性唯一标识控件。

Locked:该属性指示是否将控件锁住,让其无法在UI上移动。

 

9.20.1.3、外观类的属性

AlternatingRowsDefaultCellStyle:该属性指示表格的奇数行的单元格格式,行列索引都是从0开始的。

BackgroundColor:该属性指示表格的背景颜色。

BorderStyle:该属性指示表格的外围边框样式。

 

ColumnHeadersBorderStyle:该属性指示表格中的列头的边框样式。

ColumnHeadersDefaultCellStyle:该属性指示表格中的列头的默认样式。

ColumnHeadersHeight:该属性指示表格中的列头的行的高度。

ColumnHeadersVisible:该属性指示表格中的列头的行是否显示。

 

RowHeadersBorderStyle:该属性指示表格中的行标题单元格的边框样式。

RowHeadersDefaultCellStyle:该属性指示表格中的行标题单元格的默认样式。

RowHeadersVisible:该属性指示表格中的行标题列是否可见。

 

RowsDefaultCellStyle该属性指示表格中行单元格的默认样式

CellBorderStyle:该属性指示表格中的单元格的边框样式。

DefaultCellStyle在未设置其他样式的情况下,该属性指示表格中的非列头的普通单元格样式

GridColor:该属性指示表格中的普通单元格的网格线颜色。

9.20.1.4、行为类的属性

AllowUserToAddRows:该属性指示是否向用户提供自动添加行的功能,如果为true,就会在控件没有绑定数据或者没有在程序中添加行的情况下默认的显示出一行,当用户对这一行输入值的时候,就会出现新的一行,即便是绑定了数据或者在程序中对其添加了行,也总会多出一行出来的。即用户可以自己添加行。否则如果为false,就不会显示出默认的一行。

AllowUserToOrderColumns:该属性指示是否允许通过手动对列重新定位。即是否允许用户手动移动列头的位置。这种移动只是UI层面的移动,对于程序去引用的时候,比如:dataGridView1.Rows[0].Cells[0].Value,程序中的这个第0行第0列的值并不会因为UI层面的列头移动而改变,即UI层面的列头移动的改变不会影响程序的列索引,不管是数据绑定还是在程序中添加行的情况都是如此。

AllowUserToResizeColumns:该属性指示是否允许用户手动的改变列的大小。

AllowUserToResizeRows:该属性指示是否允许用户手动的改变行的大小。

ClipboardCopyMode该属性指示用户可否通过CTRL+C将所选的一个或者多个单元格内容复制到剪切板,以及是否包含行标题和列标题的文本:

DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText:该属性值指示可以通过CTRL+C将所选的一个或者多个单元格内容复制到剪切板,并且包含行标题和列标题的文本。

DataGridViewClipboardCopyMode.EnableWithoutHeaderText:该属性值指示可以通过CTRL+C将所选的一个或者多个单元格内容复制到剪切板,不包含行标题和列标题的文本。

DataGridViewClipboardCopyMode.EnableWithAutoHeaderText:该属性值指示可以通过CTRL+C将所选的一个或者多个单元格内容复制到剪切板,可能会包含行头或者列头,这个决定于DataGridViewSelectionMode属性以及用户是否选择了标题。

DataGridViewClipboardCopyMode.Disable: 该属性值指示不可以通过CTRL+C将所选的一个或者多个单元格内容复制到剪切板,行标题和列标题的文本更不可以。

ColumnHeadersHeightSizeMode该属性指示是否可以调整列标题的高度,是由用户调整还是根据标题的内容自动调整。

DataGridViewColumnHeadersHeightSizeMode.AutoSize:该值指示列标题的高度是根据标题的内容自动调整。

DataGridViewColumnHeadersHeightSizeMode.DisableResizing:该值指示列标题的高度既不能让用户手工的调整也不能根据标题的内容自动调整,如果列宽小于列文本宽,那么文本就会显示不全

DataGridViewColumnHeadersHeightSizeMode.EnableResizing :该值指示列标题的高度只能让用户手工的调整,不能根据标题的内容自动调整,对于自动调整,如果列宽小于列文本宽,那么文本就会显示不全

ContextMenuStrip右键该控件的时候,显示的快捷菜单。

EditMode设置如何开始编辑单元格,前提是该控件的单元格是可编辑的。

DataGridViewEditMode.EditOnEnter: 该值指示当单元格获取焦点的时候就可以编辑。Tab键横向输入值或者Enter键纵向输入值的时候很有用。

DataGridViewEditMode.EditOnF2: 该值指示当单元格获取焦点之后,按F2即可。

DataGridViewEditMode.EditOnKeystroke: 该值指示当单元格获取焦点之后,按任意字母键即可。

DataGridViewEditMode.EditOnKeystrokeOrF2: 该值指示当单元格获取焦点之后,按F2或者任意字母键即可。

DataGridViewEditMode.EditProgrammatically: 该值指示当在程序中通过调用函数DataGridView.BeginEdit(bool IsSelectAll)时开始编辑。

Enable设置指示是否启用该控件。如果为true,那么该控件被启用,它可以触发事件。否则不可触发其任何事件。

MultiSelect指示是否允许用户一次选择多个单元格,多行多列。

ReadOnly:指示是否允许用户编辑控件的单元格。False表示可以编辑,true表示不可以编辑。

RowHeadersWidthSizeMode该属性指示是否可以调整行标题的宽度,是由用户调整还是根据标题的内容自动调整。

DataGridViewRowHeadersWidthSizeMode.EnableResizing:该值指示行标题的宽度能让用户手工的调整。

DataGridViewRowHeadersWidthSizeMode.DisableResizing:该值指示行标题的宽度不能让用户手工的调整。

DataGridViewRowHeadersWidthSizeMode.AutoSizeToFirstHeader:该值指示行标题的宽度只需要适应第一行的行标题宽度。

DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders:该值指示行标题的宽度要适应所有行的行标题宽度。

DataGridViewRowHeadersWidthSizeMode. AutoSizeToDisplayedHeaders:该值指示行标题的宽度要适应所有显示的行的行标题宽度。

SelectionMode该属性指示如何选择单元格,以及选择单元格之后的影响。

DataGridViewSelectionMode.CellSelect: 该值指示可以选择一个或者多个单元格,但是这种选择只局限于对单元格的选择。此时只会对dataGridView1.SelectedCells.Count赋值,而对于dataGridView1.SelectedColumns.Count和dataGridView1.SelectedRows.Count是没有值的。

DataGridViewSelectionMode.ColumnHeaderSelect:该值指示可以通过单击列的标头来选中此列,可以单击多个列头选择多列,此时只会对dataGridView1.SelectedCells.Count、dataGridView1.SelectedColumns.Count赋值,而对于dataGridView1.SelectedRows.Count是没有值的;

也可以只选择其中几个单元格,不去选择列头,那么只会对dataGridView1.SelectedCells.Count赋值,而对于dataGridView1.SelectedColumns.Count和dataGridView1.SelectedRows.Count是没有值的。

DataGridViewSelectionMode.FullColumnSelect:该值指示可以通过单击列的标头或者某列中的某个单元格来选中此列,可以单击多个列头或者多个列单元格选择多列,此时只会对dataGridView1.SelectedCells.Count、dataGridView1.SelectedColumns.Count赋值,而对于dataGridView1.SelectedRows.Count是没有值的

DataGridViewSelectionMode.FullRowSelect: 该值指示可以通过单击行的标头或者某行的单元格来选定整个行,如果是选择多个行标头或者多个行的单元格,那么就会选中多行。此时只会对dataGridView1.SelectedCells.Count、dataGridView1.SelectedRows.Count赋值,而对于dataGridView1.SelectedColumns.Count是没有值的

DataGridViewSelectionMode.RowHeaderSelect:该值指示可以通过单击行的标头来选中此行,可以单击多个行头选择多行,此时只会对dataGridView1.SelectedCells.Count、dataGridView1.SelectedRows.Count赋值,而对于dataGridView1.SelectedColumns.Count是没有值的;

也可以只选择其中几个单元格,不去选择列头,那么只会对dataGridView1.SelectedCells.Count赋值,而对于dataGridView1.SelectedColumns.Count和dataGridView1.SelectedRows.Count是没有值的。

StandardTab:该属性指示对该控件进行Tab,是在控件内部的单元格之间变换聚焦(false),还是直接聚焦到该控件的下一个TabIndex控件(true)。即使是false,那么当按TAB键遍历完整个单元格之后,还是会聚焦到下一个TabIndex控件。

TabIndex:该属性指示该控件的Tab索引。

TabStop:该属性指示是否可以对该控件进行Tab获取焦点,true表示可以,false表示不可以。

Visible:该属性指示该控件是否可见。

9.20.1.5、数据类的属性

Columns:该属性指示该控件的列的集合。

Columns.Count:该属性指示该控件的列的集合中的列数。

对于单个列,有如下属性:

AutoSizeMode这个可以参考该控件的AutoSizeColumnsMode属性,AutoSizeColumnsMode属性是针对该控件所有列的,而AutoSizeMode属性是针对该列的。
DividerWidth这个属性设置列分隔符的宽度。

Frozen这个属性指示是否冻结该列,如果该列被设置为冻结,那么该列之前的所有列都会被默认的设置为冻结。

MininumWidth这个属性指示该列的最小宽度,当列根据内容自动压缩或者用户手工的压缩其宽度,是不能小于最小宽度的。

Width这个属性指示该列的宽度,这个宽度只是在默认情况下的值,是可以随着其他属性的变化以及用户自己手工的变化而变化的。

Name这个属性指示该列的名字,唯一标识该列,标识一个列最好用这个属性,也可以用数字索引。

ColumnType这个属性指示该列的类型,默认是DataGridViewTextBoxColumn类型。

DataPropertyName这个属性指示该列绑定的数据库表源的某个列的列名。

DefaultCellStyle这个属性设置该列中的所有单元格的默认式样。

HeaderText这个属性设置该列的列头文本。

ToolTipText这个属性设置工具提示的文本,即当鼠标移到列头的时候显示的提示信息。

Visible这个属性设置该列是否可见。

ContextMenuStrip右键该列时的菜单。

MaxInputLength指定单元格能容纳的最大字符个数。

ReadOnly控制该列是否为只读的。

Resizable指示该列的宽度是否可以调整。

SortMode

DataGridViewColumnSortMode.Automatic:除非列头用于进行选择,否则用户可以通过单击列头对列进行排序。列头包含排序标志符号的控件,将自动显示出来。点击该列可以自动的排序

DataGridViewColumnSortMode.NotSortable:仅能以编程的方式进行排序,列头不包含排序标志符号的空间。该列无法点击,点击该列无法自动排序

DataGridViewColumnSortMode.Programmatic:仅能以编程的方式进行排序,列头包含排序标志符号的空间。该列可以点击,但是是无法通过单击列头自动排序的

 

Rows:该属性指示该控件的行的集合。

Rows.Count:该属性指示该控件的行的集合中的行数。

行集合的函数:

Rows.Add():该函数是往该控件中的行集合中添加一行,函数返回的是新行在控件行集合中的索引,以下是添加行,并给行中的某一列赋值的代码:

int index = dataGridView1.Rows.Add();

dataGridView1.Rows[index].Cells[0].Value = 1111111;

注意:Cells[]在引用某个值的时候,可以用数字索引,也可以用控件的列名索引,建议用列名索引;当控件被DataSource数据绑定时,无法以编程方式Rows.Add()向 DataGridView 的行集合中添加行。

Rows.Remove(DataGridViewRow dgvr)该函数是在该控件中的行集合中删除指定的一行。

Rows.RemoveAt(int index)该函数是在该控件中的行集合中删除指定索引的一行。

注意:不论控件是否控件被DataSource数据绑定,都可以用编程方式调用上面的两个函数从 DataGridView 的行集合中删除行。

Rows.Clear()该函数是清空该控件的行集合。

注意:当控件被DataSource数据绑定时,无法以编程方式Rows.Clear()清空行集合。只能在控件没有被DataSource数据绑定时才能使用该方法。

 

DataSource:该属性指示该控件的数据源。主要是用来绑定数据的。控件会根据其列的DataPropertyName属性找到该列对应的数据源表的字段,然后绑定。当设置了该属性之后,就不能通过Rows.Add()去往空间中新增行,也不能通过Rows.Clear()清空控件的行,但是还能够通过Rows.RemoveRows.RemoveAt来移除行;可以在程序中或者UI上对已经绑定了数据库的列的单元格进行重新赋值,更可以在程序中或者UI上对那些没有绑定数据库的列进行重新的赋值。

AutoGenerateColumns:该属性指示当设置控件属性DataSource的时候,是否自动生成列。

当设置为true的时候,如果数据源的列有些被绑定了,有些没有被绑定,那么控件会将那些没有被绑定的数据源列也作为新的列自动显示出来,新列的列名是数据源表的列名,值就是对应的数据列值;已经绑定的数据源列是不会再次生成新的列的;如果控件中有些列是没有绑定数据源的,那么这些列仍然会显示出来,只是没有绑定数据而已。

当设置为false的时候,如果数据源的列有些被绑定了,有些没有被绑定,那么控件不会将那些没有被绑定的数据源列也作为新的列自动显示出来;已经绑定的数据源列是不会再次生成新的列的;如果控件中有些列是没有绑定数据源的,那么这些列仍然会显示出来,只是没有绑定数据而已。

9.20.2、事件

9.20.2.1CellClick事件

当鼠标点击某个单元格的时候,会触发这个事件,通过这个事件的参数,可以获取被点击的单元格所属的行列索引:

        private void dataGridView1_CellClick(object sender,DataGridViewCellEventArgs e)

        {

            int c = e.ColumnIndex;

            int r = e. RowIndex;

        }

 

9.20.2.2RowPrePaint事件

在发生任何单元格绘制之前,执行行级绘制时,会触发这个事件。当某一行发生绘制之前,就会触发这个事件,如果某个操作会导致控件的多行发生绘制,比如绑定该控件,或者排序该控件,那么每绘制一行之前,都会触发一次这个事件:

     private void dataGridView1_RowPrePaint(object sender,DataGridViewRowPrePaintEventArgs e)

     {

         MessageBox.Show( e.RowIndex.ToString());

     }

 

9.20.2.3RowPostPaint事件

在发生一行的所有单元格绘制之后,执行行级绘制时,会触发这个事件。当某一行发生绘制之后,就会触发这个事件,如果某个操作会导致控件的多行发生绘制,比如绑定该控件,或者排序该控件,那么每绘制一行之后,都会触发一次这个事件:

    private void dataGridView1_RowPostPaint (object sender,DataGridViewRowPrePaintEventArgs e)

    {

        MessageBox.Show( e.RowIndex.ToString());

    }

小结:DataGridView重绘

1)、当DataGridView控件绑定数据的时候,会重绘,不管第几次绑定数据,哪怕每次数据源都是一样的,都会重绘。

2)、重绘的时候,每个单元格重绘都会先触发单元格重绘事件,事件执行完之后,然后再重绘单元格,显示出来。

 

9.20.2.4DataBindingComplete事件

当控件绑定了数据源之后,就会触发该事件。

private void dataGridView1_DataBindingComplete(object sender,DataGridViewBindingCompleteEventArgs e)

        {

            UpdateDataGridViewColumn(dataGridView1, 0);

        }

 

9.20.3、该控件的小专题

9.20.3.1、控件行被删除后引起行索引变化

当编程的时候,使用dataGridView1.Rows.Remove或者dataGridView1.Rows.RemoveAt删除行,在某些情况下会出现希望删除的一些行没有被删除,这事因为如果删除了某一行之后,那么该行之后的行的索引都会减一:

比如在每一行记录前面加了checkbox,用索引去循环的判断是否选中,然后删除选中的行,如果索引从小到大去遍历,那么会导致连续选中的两行记录中第二行删除不了,因为第一行删除后,第二行的索引减一了,要解决这个问题,可以让索引从大到小去遍历。或者用下面的方法:

如果是用的SelectedCells 或者 SelectedRows 集合,然后结合foreach,那就不会少删除,因为这种方式对DataGridView的遍历是每一行都会遍历的。

            foreach( DataGridViewCell c in  dataGridView1.SelectedCells)           

            {

               //可能会多次出现同一个索引

                MessageBox.Show(c.OwningRow.Index.ToString());

                dataGridView1.Rows.Remove(c.OwningRow);

            }

 

 

9.20.3.2、列的ColumnType属性

DataGridViewCheckBoxColumn:

当某一列是复选框的时候,该列会有几个特殊的属性:

TrueValue:用户设置的字符串,如果没有设置,默认就是C#中的null。

FalseValue:用户设置的字符串,如果没有设置,默认就是C#中的null。

对于一个具体的DataGridViewCheckBoxCell的value值,如果该复选框没有被选中,那么value值是null(哪怕FalseValue已经设置了非null值);如果该复选框被选中了,如果TrueValue设置了非null值,那么就是一个具体的字符串, 如果TrueValue默认为null,那么value值是布尔true。

   

Convert.ToBoolean函数讲解:

            bool a ;//定义一个bool类型的变量,其初始值默认为false

 

            a = Convert.ToBoolean(null);//false

 

            a = Convert.ToBoolean(1);//true

            a = Convert.ToBoolean(2);//true

            a = Convert.ToBoolean(0);//false

            a = Convert.ToBoolean(-1);//true

           

            a = Convert.ToBoolean("");//报错

            a = Convert.ToBoolean("1");//报错

       a = Convert.ToBoolean("0");//报错

一个具体的DataGridViewCheckBoxCell的两种应用:

TrueValue、FalseValue都没有设置,默认都是null:

//此时如果没有选中,那么dgvcbc.Value就是null,布尔转换后就是false,选中后dgvcbc.Value就是布尔的true值。

                DataGridViewCheckBoxCell dgvcbc = dataGridView1.Rows[i].Cells[0]as DataGridViewCheckBoxCell;                     

                if (Convert.ToBoolean(dgvcbc.Value) ==true)

                {

                    MessageBox.Show(Convert.ToBoolean(dgvcbc.Value).ToString());

                }

                else

                {

                    MessageBox.Show(Convert.ToBoolean(dgvcbc.Value).ToString());

                }

TrueValue、FalseValue都有设置:

                    DataGridViewCheckBoxCell dgvcbc = dataGridView1.Rows[i].Cells[0]as DataGridViewCheckBoxCell;

//此时如果没有选中,那么dgvcbc.Value就是null,选中后dgvcbc.Value就是设置的TrueValue字符串值。

                if (dgvcbc.Value ==null)

                {

                    MessageBox.Show("未选中!");

                }

                else if (dgvcbc.Value.ToString() == "8")

                {

                    MessageBox.Show("选中!");

                }

 

DataGridViewButtonColumn:

DataGridViewButtonColumn btn = new DataGridViewButtonColumn();

                    btn.Text = "启用";

                    btn.HeaderText = "启用或停用";

                    btn.Name = "corr";

                    btn.UseColumnTextForButtonValue = true;

                    this.dgvInventory.Columns.Add(btn);

9.20.3.3、点击列头排序

如果使用的是int index = dataGridView2.Rows.Add();方式对控件进行数据绑定,那么每次添加了行绑定之后,是不会去触发DataBindingComplete 事件的,因为控件并没有真正的绑定数据源。对每一列的列头进行点击排序的时候,如果控件中有一列是序号列,而且序号列的值是按照添加行的顺序依次递增的,那么点击任何列排序之后,都可能打乱了该列的值,如果想让该序号列的顺序值保持不变,可以在排序动作触发的RowPostPaint或者RowPrePaint事件中对序号列进行赋值。

如果以给控件的DataSource属性赋值的方式来绑定该控件,那么绑定之后就会触发DataBindingComplete 事件,也会去触发RowPostPaint和RowPrePaint事件,就算绑定的数据源没有变化,每次绑定之后仍然会去触发这些事件。如果有一个序号列是没有绑定的,而是通过别的方式直接给该序号列赋值的,那么该序号列点击之后是不会排序的,点击绑定列的时候才会排序(DataGridView控件是可以通过它的DataSource属性绑定数据源的,一旦绑定了,那么这个数据源就存储在控件中了,排序的原理就是把存储在它里面的数据进行排序,然后重新绑定这个控件,实质是对数据排序后,重新建立一张表,给DataSource属性赋值了,也就是每点击一次列,就对其内的数据排序一次,然后就会将新的结果集重新绑定一次DataGridView控件),点击完绑定列之后,排序之后,会将其他未绑定的列清空。要想将那些未绑定的数据列重新赋值,那么只能通过DataBindingComplete 、RowPostPaint和RowPrePaint事件。另外如果序号列是绑定的,那么排序后会打乱其顺序,可以在程序中通过DataBindingComplete 、RowPostPaint和RowPrePaint事件对已经绑定了数据库的列的单元格进行重新赋值。 

2009-03-08---2009-07-18

你可能感兴趣的:(timer,timer,ListView,ListView,ListView,datagridview,datagridview,treeview,treeview)