DataGrid的用法.docx
- 文档编号:30017020
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:22
- 大小:92.64KB
DataGrid的用法.docx
《DataGrid的用法.docx》由会员分享,可在线阅读,更多相关《DataGrid的用法.docx(22页珍藏版)》请在冰豆网上搜索。
DataGrid的用法
前几天打算尝试下DataGrid的用法,起初以为应该很简单,可后来被各种使用方法和功能实现所折磨。
网络上的解决方法太多,但也太杂。
没法子,我只好硬着头皮阅览各种文献资料,然后不断的去尝试,总算小有成果。
因此,把我学到的和大家分享一下,相信这篇文章会让你再很短的时间内学会DataGrid的大部分主要功能,而且很多难点都可以在里面找到解决方案。
由于涉及的应用比较多,所以篇幅会很长。
但可以确保各个版块相互独立,总共4个部分
1.数据绑定
2.DataGrid的增改删功能
3.DataGrid的分页实现
4.DataGrid的样式设计
先上一张截图,让你大概知道自己需要的功能是否在这张图里有所实现。
PS:
使用技术:
WPF+ADO.NETEntityFramework
1.数据绑定(涉及DataGrid绑定和Combox绑定)
在DataGrid中同时包含“自动生成列”与“用户自定义列”由属性AutoGenerateColumns控制。
默认情况下,DataGrid将根据数据源自动生成列。
下图列出了生成的列类型。
如果AutoGenerateColumns="True",我们只需要如下几行代码
后台dataGrid1.ItemsSource=infoList;//infoList为内容集合(这是我从数据库中获取的记录集合类型为List
PS:
因为这里给dataGrid1绑定了数据源,所以下面绑定的字段都是infoList中的字段名称,同样也对应着我数据表中的字段名。
里面包含FID,公司名称,职员姓名,性别,年龄,职务。
解释下,怕大家无法理解Binding后面的值是如何来的了
显然这种数据绑定非常的容易,如果对表格要求不高,这中无疑是最简单方便的。
如果AutoGenerateColumns="False"表格字段的显示就要靠我们手动去完成了。
这个也是数据绑定的重点,因为实际应用中我们大多都是自定义去完成DataGrid的数据绑定。
接下来贴出代码(后面的所有功能都可以在此代码基础上添加和修改)
[html]viewplaincopyprint?
1. Class="CSDN_C.MainWindow" 2.xmlns=" 3.xmlns: x=" 4.xmlns: assembly="clr-namespace: System;assembly=mscorlib" 5.xmlns: local="clr-namespace: Demo" 6.Title="MainWindow"Loaded="Window_Loaded"> 7. 8. Key="keySex"MethodName="GetValues"ObjectType="{x: Typeassembly: Enum}"> 9. 10. TypeType="local: Sex"> Type> --引用后台的枚举类型,为字段‘性别’提供数据源。 上面引用了命名空间Demo--> 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. --Combox绑定,获取上面定义的资源keySex.绑定性别--> 29. 30. 31. 32. 33. 34. 后台 [csharp]viewplaincopyprint? 1.namespaceDemo{ 2./// 3.///MainWindow.xaml的交互逻辑 4./// 5.publicenumSex{男,女};//注意写在命名空间内,不要写在类里,否则台前local: Sex找不到路径 6. 7.} 当我们绑定好数据运行程序的时候,会发现DataGridComboBoxColumn下拉框里虽然绑定了值,但是他不会默认显示出已经设定好的值。 所以我们就可以摈弃这种现有的DataGridComboBoxColumn,我们用DataGrid样板标签DataGridTemplateColumn。 我们在DataGridTemplateColumn标签里要用到2个控件,一个TextBlock控件来显示内容,另一个ComBox来提供选择。 所以我们可以用如下代码替换掉 [html]viewplaincopyprint? 1. 2. 3. 4. --显示状态时显示TextBlock里的值--> 5. 6. 7. 8. --编辑状态就切换到ComboBox里进行下拉选择操作--> 9. Name="taskCombo"ItemsSource="{BindingSource={StaticResourcekeySex}}"SelectedItem="{BindingPath=性别}"IsSynchronizedWithCurrentItem="False"/> 10. 11. 12. 注意CellTemplate和CellEditingTemplate的区别 2.DataGrid的增改删功能 ①添加记录行+编辑记录行 由于增加和编辑有一定的联系,所以就放一起来讨论 在上面的代码处添加2个Button按钮,DataGrid默认是输入一行记录后自动会生成一个新行(类似MSSQL数据库添加表记录)。 由属性CanUserAddRows来控制当CanUserAddRows=false的时候就不会自动生成新行。 为了方便我们自己来控制,所以在DataGrid里面设置CanUserAddRows为false. [html]viewplaincopyprint? 1. 2. 3. 4. --此时的DataGrid就无法自己生成新行了--> 5. 6. 后台事件 [csharp]viewplaincopyprint? 1.intjudge=0;//0表示编辑状态,1为添加状态。 因为后面的增加和编辑都在同一个事件中,所以建一个变量来区分操作 2. 3.TB_InformationtbInfo=newTB_Information();//这个类可以供我调用里面的方法来进行增删改查的操作 4. 5.privatevoidbtnAdd_Click(objectsender,RoutedEventArgse) 6.{ 7. 8.judge=1;//现在为添加状态 9. 10.dataGrid1.CanUserAddRows=true;//点击添加后将CanUserAddRows重新设置为True,这样DataGrid就会自动生成新行,我们就能在新行中输入数据了。 11.} 12. 13. 14.//现在我们可以添加新记录了,我们接下来要做的就是获取这些新添加的记录 15. 16.//先声明一个存储新建记录集的List 17. 18.List 19. 20.//我们通过RowEditEnding来获取新增的记录,就是每次编辑完行后,行失去焦点激发该事件。 更新记录也是执行该事件 21. 22.privatevoiddataGrid1_RowEditEnding(objectsender,DataGridRowEditEndingEventArgse) 23.{ 24.Informationinfo=newInformation();//我自己的数据表实例类 25.info=e.Row.ItemasInformation;//获取该行的记录 26.if(judge==1)//如果是添加状态就保存该行的值到lstInformation中这样我们就完成了新行值的获取 27.{ 28.lstInformation.Add(info); 29.} 30.else 31.{ 32.tbInfo.UpdInformation(info);//如果是编辑状态就执行更新操作更新操作最简单,因为你直接可以在DataGrid里面进行编辑,编辑完成后执行这个事件就完成更新操作了 33.} 34.} 35. 36. 37. 38.//获取到记录后,单击保存按钮就可以保存lstInformation中的每一条记录 39.privatevoidbtnSave_Click(objectsender,RoutedEventArgse) 40.{ 41.foreach(InformationinfoinlstInformation) 42.{ 43.tbInfo.InsInformation(info);//执行插入方法,将记录保存到数据库 44.} 45.judge=0;//重新回到编辑状态 46.lstInformation.Clear(); 47.dataGrid1.CanUserAddRows=false;//因为完成了添加操作所以设置DataGrid不能自动生成新行了 48.Binding(Num,1); 49.} 这里又会遇到一个问题。 那就是更新数据的时候,发现数据更本就没更新。 跟踪代码会发现后台得到的值还是原来的,无法获取编辑后的值。 这个问题就是绑定模式的问题,我们只需设置双向绑定就可以了。 且作用对象是在属性值更改的情况下进行双向绑定。 只要在前面的每个表字段处加上Mode=TwoWay,UpdateSourceTrigger=PropertyChanged问题就解决了 例如: ②删除记录 为了有良好的用户体验,我就做了个可以批量删除的删除功能。 就是利用到CheckBox控件来完成。 以绑定代码为基础添加代码 首先我们要获取CheckBox中的值,有哪些是被选中的。 显然CheckBox里面还必须绑定值,并且还需要一个事件。 给CheckBox添加的代码如下 后台代码 [csharp]viewplaincopyprint? 1.//由ChecBox的Click事件来记录被选中行的FID 2. 3.List 4. 5.privatevoidCheckBox_Click(objectsender,RoutedEventArgse) 6.{ 7.CheckBoxdg=senderasCheckBox; 8.intFID=int.Parse(dg.Tag.ToString());//获取该行的FID 9.varbl=dg.IsChecked; 10.if(bl==true) 11.{ 12.selectFID.Add(FID);//如果选中就保存FID 13.} 14.else 15.{ 16.selectFID.Remove(FID);//如果选中取消就删除里面的FID 17.} 18.} 19. 20. 21. 22.//已经获取到里面的值了,接下来就只要完成删除操作就可以了删除事件如下 23. 24.privatevoidbtnDelete_Click(objectsender,RoutedEventArgse) 25.{ 26.foreach(intFIDinselectFID) 27.{ 28.tbInfo.DelInformation(FID);//循环遍历删除里面的记录 29.} 30.//Binding(Num,1);//这个是我绑定的一个方法,作用是删除记录后重新给DataGrid赋新的数据源 31.} 3.DataGrid的分页实现 原理: 其实分页功能的实现大家都清楚,无非就是把一个记录集通过运算来刷选里面对应页码的记录。 接来下我们再次添加新的代码 [html]viewplaincopyprint? 1. 2. 3. --省略N个代码--> 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 首先我们先写个分页的方法,供上面这些事件调用 后台代码 [csharp]viewplaincopyprint? 1.//number表示每个页面显示的记录数currentSize表示当前显示页数 2. 3.privatevoidBinding(intnumber,intcurrentSize) 4.{ 5.List 6.infoList=tbInfo.GetInformationList();//获取数据源 7.intcount=infoList.Count;//获取记录总数 8.intpageSize=0;//pageSize表示总页数 9.if(count%number==0) 10.{ 11.pageSize=count/number; 12.} 13.else 14.{ 15.pageSize=count/number+1; 16.} 17.tbkTotal.Text=pageSize.ToString(); 18. 19.tbkCurrentsize.Text=currentSize.ToString(); 20.infoList=infoList.Take(number*currentSize).Skip(number*(currentSize-1)).ToList();//刷选第currentSize页要显示的记录集 21.dataGrid1.ItemsSource=infoList;//重新绑定dataGrid1 22.} 23. 24. 25. 26.//分页方法写好了接下来就是响应下一页,上一页,和跳转页面的事件了 27. 28.//先定义一个常量 29. 30.constintNum=12;//表示每页显示12条记录 31. 32.//上一页事件 33. 34.privatevoidbtnUp_Click(objectsender,RoutedEventArgse) 35.{ 36.intcurrentsize=int.Parse(tbkCurrentsize.Text);//获取当前页数 37.if(currentsize>1) 38.{ 39.Binding(Num,currentsize-1);//调用分页方法 40.} 41.} 42. 43. 44.//下一页事件 45.privatevoidbtnNext_Click(objectsender,RoutedEventArgse) 46.{ 47.inttotal=int.Parse(tbkTotal.Text);//总页数 48.intcurrentsize=int.Parse(tbkCurrentsize.Text);//当前页数 49.if(currentsize 50.{ 51.Binding(Num,currentsize+1);//调用分页方法 52.} 53.} 54. 55. 56.//跳转事件 57.privatevoidbtnGo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DataGrid 用法