当前位置:   article > 正文

C#开发WinForm之DevExpress框架-(GridControll常见使用方式)_c# devexpress

c# devexpress

C#开发WinForm之DevExpress框架里GridControll常见使用方式

DataConrol绑定数据

它的绑定数据的方式和TreeList很类似。新建Winfrom->拖拽一个DataControl控件到窗体里,点击Run Designer->弹出窗口里选中Columns,在这里面增加列,注意如果不设置Visible=false,这里面设置的列都是将会显示的列。

创建Columns和Rows并绑定数据

  1. DataTable dt = new DataTable();
  2. dt.Columns.Add("index");
  3. dt.Columns.Add("uidItem");
  4. dt.Columns.Add("uidItemRevision");
  5. dt.Columns.Add("primaryTag");
  6. dt.Columns.Add("natureOfItem");
  7. dt.Columns.Add("itemId");
  8. for (int i = 0; i < 100; i++)
  9. {
  10. DataRow dataRow = dt.NewRow();
  11. dataRow["index"] = "" + i;
  12. dataRow["uidItem"] = "" + i;
  13. dataRow["uidItemRevision"] = "" + i;
  14. dataRow["primaryTag"] = "" + i;
  15. dataRow["natureOfItem"] = "" + i;
  16. dataRow["itemId"] = "" + i;
  17. dt.Rows.Add(dataRow);
  18. }
  19. this.gridControl1.DataSource = null;
  20. this.gridControl1.DataSource = dt;

注意我们在Run Desinger里编辑的列是展示用的,而代码里dt.Columns.Add(“index”);添加的列属性,不是用于显示用的,只有列的字段和Run Desinger里列的FieldName匹配时才显示。

  1. dt.Columns.Add("index");
  2. dataRow["index"] = "" + i;

这2个组成的是行列数据,注意是数据,用于绑定用的。

如果我们不在Run Desinger里手动添加列,想根据行列数据动态创建列的显示,只要设置好DataSource后,执行this.gridView1.PopulateColumns();语句即可。

获得选中数据

有如下三种方式

第一种:根据行号和列属性值取单元格

  1. //获得选中的行,如果是单选模式,则直接取第一个
  2. int selectRow = gridView1.GetSelectedRows()[0];
  3. //指定行和列属性名取单元格数据
  4. string name = this.gridView1.GetRowCellValue(selectRow, "uidItem").ToString();

第二种:根据绑定的数据(推荐)

  1. //获得选中的行,如果是单选模式,则直接取第一个
  2. int selectRow = gridView1.GetSelectedRows()[0];
  3. //获得绑定的行数据
  4. DataRow dataRow = gridView1.GetDataRow(selectRow);
  5. //从绑定的行数据直接取数据
  6. string uidItem = (string)dataRow["uidItem"];
  7. string uidItemRevision = (string)dataRow["uidItemRevision"];

第三种:杂

获得选中单元格值,不是行值。

  1. //获得选中单元格值
  2. var obj = gridView1.FocusedValue;

选中事件

选中gridController下的gridView,(gridController和gridView都是可选中的),选中后在属性面板下可看到gridView的属性和事件。

事件FocusedRowChanged和FocusedRowObjectChanged都会在gridView被选中时触发,任选其一即可。比如FocusedRowObjectChanged的事件监听函数如下:

  1. private void Gridview1_FocusedRowObjectChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowObjectChangedEventArgs e)
  2. {
  3. //获得选中的行,如果是单选模式,则直接取第一个
  4. int selectRow = gridView1.GetSelectedRows()[0];
  5. //获得绑定的行数据
  6. DataRow dataRow = gridView1.GetDataRow(selectRow);
  7. //从绑定的行数据直接取数据
  8. string uidItem = (string)dataRow["uidItem"];
  9. string uidItemRevision = (string)dataRow["uidItemRevision"];
  10. }
注意,有些人说SelectionChanged事件可以选中触发,我试了不可以。不知道是不是因为我将选中设为选中整个行的问题(this.gridView1.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFullFocus;)

控制列显示顺序

this.btnOk.TabIndex = 1;

对GridView的一些个性设置

参考DevExpress GridControl使用方法总结
如何隐藏GridControl的GroupPanel表头:设置Run Design->OptionsView->ShowGroupPanel 设置为:false
如何解决单击记录整行选中的问题:View->OptionsBehavior->EditorShowMode 设置为:Click
如何解决GridControl记录能获取而没有显示出来的问题:gridView.populateColumns();//会将所有的绑定数据都显示出来
如何让行只能选择而不能编辑(或编辑某一单元格):

(1)、View->OptionsBehavior->EditorShowMode 设置为:Click

(2)、View->OptionsBehavior->Editable 设置为:false

如何禁用GridControl中单击列弹出右键菜单:设置Run Design->OptionsMenu->EnableColumnMenu 设置为:false
如何隐藏GridControl的GroupPanel表头:设置Run Design->OptionsView->ShowGroupPanel 设置为:false
如何禁用GridControl中列头的过滤器:设置 Run Design->OptionsCustomization->AllowFilter 设置为:false
如何显示水平滚动条:设置this.gridView.OptionsView.ColumnAutoWidth = false;
如何定位到第一条数据/记录:this.gridView.MoveFirst()
如何定位到下一条数据/记录:this.gridView.MoveNext()
如何定位到最后一条数据/记录:this.gridView.MoveLast()
设置成一次选择一行,并且不能被编辑:
 

  1. this.gridView1.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFocus;
  2. this.gridView1.OptionsBehavior.Editable = false;
  3. this.gridView1.OptionsSelection.EnableAppearanceFocusedCell = false;
  4. //默认选中第一行
  5. this.gridView1.OptionsSelection.EnableAppearanceHideSelection = false;

如何显示行号:

  1. this.gridView1.IndicatorWidth = 40;
  2. //显示行的序号
  3. private void gridView1_CustomDrawRowIndicator(object sender, RowIndicatorCustomDrawEventArgs e)
  4. {
  5. if (e.Info.IsRowIndicator && e.RowHandle>=0)
  6. {
  7. e.Info.DisplayText = (e.RowHandle + 1).ToString();
  8. }
  9. }

如何让各列头禁止移动:gridView1.OptionsCustomization.AllowColumnMoving = false;
如何让各列头禁止排序:gridView1.OptionsCustomization.AllowSort = false;
如何禁止各列头改变列宽:gridView1.OptionsCustomization.AllowColumnResizing = false;
设某一列文字和标题局中显示 :
 

  1. gridView1.Columns[0].AppearanceHeader.TextOptions.HAlignment =DevExpress.Utils.HorzAlignment.Center;
  2. gridView1.Columns[0].AppearanceCell.TextOptions.HAlignment =DevExpress.Utils.HorzAlignment.Center;

分页

GridControl控件分页很奇怪,他提供的DataSource就是一页数据,并不是我们常想的那样,把所有数据都提供给DataSource,根据参数配置,设置Step(每页显示多数),实现分页。所以要想实现分页功能就要在DataSouce数据源上下功能。
GridControl自带分页控件。

设置控件属性

设置this.gridControl1.useEmbeddedNavigator = true,会显示出分页控件。在控件的属性面板上有个EmbeddedNavigator选项,在这里设置分页控件属性。
先设置Buttons选项,分页控件上有很多Button,有删除,编辑,上一页,首页,下一页,尾页等,有些是不需要的,可以在这里选中某个Button,然后设置为Visible=false。比如

在这里插入图片描述

最终显示效果是

设置其它参数:
TextLocation=Center,
TextStringFormat="";//里面内容我们在代码里做。
其它就用默认即可。

设置控件ButtonClick事件

选中控件,在属性面板下找到EmbeddedNavigator选项下的ButtonClick,增加事件,如下

代码

总体思路是:根据总页数,每页显示条和当前页数,从allList截取出当前显示出的数据,然后添加到currentPageList集合里,然后再对currentPageList集合构造DataTable,将DataTable给DataSource。在上一页/下一页事件监听器中,根据按钮类型操作pageIndex,之后从前走一遍上面的流程
 

  1. public class TestVo{
  2. /// <summary>
  3. ///
  4. /// </summary>
  5. public string name{ get; set; }
  6. /// <summary>
  7. ///
  8. /// </summary>
  9. public string age{ get; set; }
  10. }
  11. //所有数据
  12. private List<TestVo> allList = new List<TestVo>();
  13. //页行数
  14. public int pagesize = 10;
  15. //当前页
  16. public int pageIndex = 1;
  17. //总页数
  18. public int pageCount;
  19. //选中的数据
  20. private List<TestVo> currentPageList = new List<TestVo>();
  21. //选中的数据经过处理放到DataTable里
  22. private DataTable dt;
  23. /// <summary>
  24. /// 初始化树信息
  25. /// </summary>
  26. private void LoadData()
  27. {
  28. dt = new DataTable();
  29. dt.Columns.Add("name");
  30. dt.Columns.Add("age");
  31. calPage();
  32. }
  33. /// <summary>
  34. /// 计算分页数据
  35. /// </summary>
  36. private void calPage()
  37. {
  38. currentPageList.Add(new TestVo() { name="张三", age="12"});
  39. currentPageList.Add(new TestVo() { name="李四", age="13"});
  40. currentPageList.Add(new TestVo() { name="王五", age="10"});
  41. currentPageList.Add(new TestVo() { name="麻六", age="20"});
  42. int count = allList .Count;
  43. pageCount = count / pagesize;
  44. if(count % pagesize > 0)
  45. {
  46. pageCount++;
  47. }
  48. calCurrentPageList();
  49. }
  50. /// <summary>
  51. /// 计算每页数据
  52. /// </summary>
  53. private void calCurrentPageList()
  54. {
  55. dt.Clear();
  56. currentPageList.Clear();
  57. //记录获取开始数
  58. int startIndex = (pageIndex - 1) * pagesize;
  59. int endIndex = pageIndex * pagesize;
  60. if(endIndex > allList .Count)
  61. {
  62. endIndex = allList .Count;
  63. }
  64. for (int i = startIndex; i < endIndex; i++)
  65. {
  66. TestVo testVo = allList [i];
  67. currentPageList.Add(testVo );
  68. }
  69. int index = 1;
  70. ParseDataTable(dt, currentPageList, ref index);
  71. this.gridControl1.DataSource = null;
  72. this.gridControl1.DataSource = dt;
  73. // this.gridControl1.EmbeddedNavigator.Text = string.Format("第 {0}页 ,共 {1}", pageIndex, pageCount);
  74. //在这里设置分页的文字展示
  75. this.gridControl1.EmbeddedNavigator.TextStringFormat = string.Format("第 {0}页 ,共 {1}", pageIndex, pageCount);
  76. }
  77. ///
  78. ///生成行数据
  79. ///
  80. private void ParseDataTable(DataTable dt, List<TestVo > list, ref int index)
  81. {
  82. foreach(TestVo testVo in list)
  83. {
  84. DataRow dataRow = dt.NewRow();
  85. dataRow["name"] = testVo.name;
  86. dataRow["age"] = testVo .age;
  87. dt.Rows.Add(dataRow);
  88. }
  89. }
  90. ///button事件
  91. private void gridControl_EmbeddedNavigatorClick(object sender, DevExpress.XtraEditors.NavigatorButtonClickEventArgs e)
  92. {
  93. if (e.Button.ButtonType == NavigatorButtonType.NextPage)
  94. {
  95. pageIndex++;
  96. }
  97. else if (e.Button.ButtonType == NavigatorButtonType.PrevPage)
  98. {
  99. pageIndex--;
  100. }
  101. else if (e.Button.ButtonType == NavigatorButtonType.Last)
  102. {
  103. pageIndex = pageCount;
  104. }
  105. else if (e.Button.ButtonType == NavigatorButtonType.First)
  106. {
  107. pageIndex = 1;
  108. }
  109. calCurrentPageList();
  110. }

导出excel、pdf、rtf等格式

DevExpress的GridControl提供方便的数据导出功能,可以方便的导出Exce,PDF,Html页面,world形式,无需写额外的代码,方便、快捷。

  1. private void ExportPdf()
  2. {
  3. using (SaveFileDialog saveDialog = new SaveFileDialog())
  4. {
  5. saveDialog.Filter = "Excel (2003)(.xls)|*.xls|Excel (2010) (.xlsx)|*.xlsx |RichText File (.rtf)|*.rtf |Pdf File (.pdf)|*.pdf |Html File (.html)|*.html";
  6. if (saveDialog.ShowDialog() != DialogResult.Cancel)
  7. {
  8. string exportFilePath = saveDialog.FileName;
  9. string fileExtenstion = new FileInfo(exportFilePath).Extension;
  10. switch (fileExtenstion)
  11. {
  12. case ".xls":
  13. gridControl1.ExportToXls(exportFilePath);
  14. break;
  15. case ".xlsx":
  16. gridControl1.ExportToXlsx(exportFilePath);
  17. break;
  18. case ".rtf":
  19. gridControl1.ExportToRtf(exportFilePath);
  20. break;
  21. case ".pdf":
  22. gridControl1.ExportToPdf(exportFilePath);
  23. break;
  24. case ".html":
  25. gridControl1.ExportToHtml(exportFilePath);
  26. break;
  27. case ".mht":
  28. gridControl1.ExportToMht(exportFilePath);
  29. break;
  30. default:
  31. break;
  32. }
  33. if (File.Exists(exportFilePath))
  34. {
  35. try
  36. {
  37. if (DialogResult.Yes == MessageBox.Show("文件已成功导出,是否打开文件?", "提示", MessageBoxButtons.YesNo))
  38. {
  39. System.Diagnostics.Process.Start(exportFilePath);
  40. }
  41. }
  42. catch
  43. {
  44. String msg = "The file could not be opened." + Environment.NewLine + Environment.NewLine + "Path: " + exportFilePath;
  45. MessageBox.Show(msg, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
  46. }
  47. }
  48. else
  49. {
  50. String msg = "The file could not be saved." + Environment.NewLine + Environment.NewLine + "Path: " + exportFilePath;
  51. MessageBox.Show(msg, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
  52. }
  53. }
  54. }
  55. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/309744
推荐阅读
相关标签
  

闽ICP备14008679号