RWWithChart.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. using Sunny.UI;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Windows.Forms;
  7. namespace WWPipeLine.MapBasic.Results
  8. {
  9. public class RWWithChart : ResultWindow
  10. {
  11. /// <summary>
  12. /// DataGridView控件
  13. /// </summary>
  14. protected UIDataGridView m_DataGridView;
  15. /// <summary>
  16. /// UIChart控件
  17. /// </summary>
  18. protected UIChart m_UIChart;
  19. /// <summary>
  20. /// UIChart的Option属性
  21. /// </summary>
  22. protected UIOption m_UIOption;
  23. /// <summary>
  24. /// Chart类型,默认为Bar
  25. /// </summary>
  26. protected UIChartType m_ChartType = UIChartType.Bar;
  27. /// <summary>
  28. /// 默认的Chart标题
  29. /// </summary>
  30. protected string m_ChartTitle = "统计结果";
  31. /// <summary>
  32. /// 是否显示表格DataGridView,默认显示
  33. /// </summary>
  34. protected bool ShowDataGridView = true;
  35. /// <summary>
  36. /// 设置Chart图的标题
  37. /// </summary>
  38. protected virtual string ChartTitle { get => m_ChartTitle; set => m_ChartTitle = value; }
  39. /// <summary>
  40. /// 图表类型
  41. /// </summary>
  42. public enum UIChartType
  43. {
  44. /// <summary>
  45. /// 柱状图
  46. /// </summary>
  47. Bar,
  48. /// <summary>
  49. /// 折线图
  50. /// </summary>
  51. Line,
  52. /// <summary>
  53. /// 饼图
  54. /// </summary>
  55. Pie,
  56. /// <summary>
  57. /// 扩展后的柱状图
  58. /// </summary>
  59. BarEx,
  60. /// <summary>
  61. /// 跑道图
  62. /// </summary>
  63. Doughnut
  64. }
  65. /// <summary>
  66. /// 设置图表内容。包括数值、颜色等
  67. /// </summary>
  68. /// <param name="dt"></param>
  69. protected virtual void AddOptionSeries(DataTable dt)
  70. {
  71. }
  72. /// <summary>
  73. /// 设置X轴的列名
  74. /// </summary>
  75. /// <param name="dt"></param>
  76. protected virtual void AddXAxis(DataTable dt)
  77. {
  78. }
  79. /// <summary>
  80. /// 设置图例的内容
  81. /// </summary>
  82. /// <param name="dt"></param>
  83. protected virtual void SetLegendItem(DataTable dt)
  84. {
  85. }
  86. /// <summary>
  87. /// 设置Chart的Option的扩展信息
  88. /// </summary>
  89. protected virtual void SetOptionEx()
  90. {
  91. }
  92. /// <summary>
  93. /// 根据传入的数据显示Chart图和表格
  94. /// </summary>
  95. /// <param name="data"></param>
  96. public override void ShowData(object data)
  97. {
  98. if (!(data is DataTable))
  99. {
  100. Sunny.UI.UIMessageTip.ShowWarning("数据错误,未能显示图表"); return;
  101. }
  102. var dt = data as DataTable;
  103. if (ShowDataGridView)
  104. {
  105. this.CreateDataGridView(dt);
  106. }
  107. AddChart(); //将Chart控件添加到界面
  108. m_UIOption.Title = new UITitle { Text = ChartTitle };
  109. AddOptionSeries(dt);//设置图表内容,包括数值、颜色等
  110. AddXAxis(dt);//设置X轴的列名
  111. SetLegend();//设置图例的位置
  112. SetLegendItem(dt);//设置图例的内容
  113. SetOptionEx();//设置Chart的Option的扩展信息
  114. this.m_UIChart.SetOption(m_UIOption);
  115. }
  116. /// <summary>
  117. /// 创建DataGridView控件并绑定数据源到DataTable
  118. /// </summary>
  119. /// <param name="dt"></param>
  120. protected virtual void CreateDataGridView(DataTable dt)
  121. {
  122. if (m_DataGridView == null)
  123. {
  124. m_DataGridView = new Sunny.UI.UIDataGridView
  125. {
  126. Dock = DockStyle.Fill,
  127. AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill,
  128. SelectionMode = DataGridViewSelectionMode.FullRowSelect,
  129. DefaultCellStyle = new DataGridViewCellStyle() { ForeColor = Color.Black, Alignment = DataGridViewContentAlignment.MiddleCenter },
  130. ShowEditingIcon = false,
  131. ShowCellToolTips = false,
  132. AllowUserToAddRows = false,
  133. AllowUserToResizeRows = false,
  134. AllowUserToDeleteRows = false,
  135. AllowUserToOrderColumns = false,
  136. ReadOnly = true,
  137. MultiSelect = false,
  138. BorderStyle = BorderStyle.None,
  139. CellBorderStyle = DataGridViewCellBorderStyle.None,
  140. RowHeadersVisible = false
  141. };
  142. this.Controls.Add(m_DataGridView);
  143. }
  144. m_DataGridView.DataSource = dt;
  145. if (System.Text.RegularExpressions.Regex.IsMatch(dt.TableName?.ToString(), @"[\u4e00-\u9fa5]"))
  146. this.m_DataGridView.Tag = dt.TableName?.ToString();
  147. for (int i = 0; i < m_DataGridView.Columns.Count; i++)
  148. {
  149. m_DataGridView.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
  150. m_DataGridView.Columns[i].HeaderText = dt.Columns[i].Caption;
  151. }
  152. }
  153. /// <summary>
  154. /// 将Chart控件添加到界面
  155. /// </summary>
  156. protected virtual void AddChart()
  157. {
  158. m_UIChart.RadiusSides = UICornerRadiusSides.None;
  159. m_UIChart.RectSides = ToolStripStatusLabelBorderSides.None;
  160. this.Controls.Add(this.m_UIChart);
  161. if (this.ShowDataGridView)
  162. m_UIChart.Dock = DockStyle.Top;
  163. else
  164. m_UIChart.Dock = DockStyle.Fill;
  165. }
  166. private void UiSymbolButtonExportToImage_Click(object sender, EventArgs e)
  167. {
  168. ExportToImage(this.m_UIChart);
  169. }
  170. private void UiSymbolButtonExportToExcel_Click(object sender, EventArgs e)
  171. {
  172. ExportToExcel(this.m_DataGridView);
  173. }
  174. /// <summary>
  175. /// 根据实际需要展示的图类型Pie/Bar/Line/BarEx/Doughnut五种创建Chart控件
  176. /// </summary>
  177. protected virtual void CreateChart()
  178. {
  179. }
  180. /// <summary>
  181. /// 设置X轴显示的文字
  182. /// </summary>
  183. /// <returns></returns>
  184. protected virtual string SetXAxisName()
  185. {
  186. return "系列";
  187. }
  188. /// <summary>
  189. /// 设置Y轴显示的文字
  190. /// </summary>
  191. /// <returns></returns>
  192. protected virtual string SetYAxisName()
  193. {
  194. return "值";
  195. }
  196. /// <summary>
  197. /// 设置图例的位置,默认右下角
  198. /// </summary>
  199. protected virtual void SetLegend()
  200. {
  201. m_UIOption.Legend = new UILegend
  202. {
  203. Orient = UIOrient.Horizontal,
  204. Top = UITopAlignment.Bottom,
  205. Left = UILeftAlignment.Right
  206. };
  207. }
  208. /// <summary>
  209. /// 大小改变时修改Chart的大小为总高度的2/3
  210. /// </summary>
  211. /// <param name="e"></param>
  212. protected override void OnSizeChanged(EventArgs e)
  213. {
  214. base.OnSizeChanged(e);
  215. if (m_UIChart == null) return;
  216. this.m_UIChart.Height = 2 * this.Height / 3;
  217. }
  218. /// <summary>
  219. /// 配置当前窗体,并继承自查询结果ResultWindow窗体
  220. /// </summary>
  221. public RWWithChart() : base()
  222. {
  223. CreateExportImageAndExcelButton();
  224. base.uiSymbolButtonExportToExcel.Click += UiSymbolButtonExportToExcel_Click;
  225. base.uiSymbolButtonExportToImage.Click += UiSymbolButtonExportToImage_Click;
  226. CreateChart();
  227. InitializeComponent();
  228. SetColors();
  229. }
  230. private void InitializeComponent()
  231. {
  232. this.SuspendLayout();
  233. //
  234. // uiChart
  235. //
  236. this.m_UIChart.Dock = System.Windows.Forms.DockStyle.Fill;
  237. this.m_UIChart.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(244)))), ((int)(((byte)(244)))), ((int)(((byte)(244)))));
  238. this.m_UIChart.Font = new System.Drawing.Font("微软雅黑", 12F);
  239. this.m_UIChart.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(54)))), ((int)(((byte)(54)))), ((int)(((byte)(54)))));
  240. this.m_UIChart.Location = new System.Drawing.Point(0, 0);
  241. this.m_UIChart.MinimumSize = new System.Drawing.Size(1, 1);
  242. this.m_UIChart.Name = "uiChart";
  243. this.m_UIChart.Size = new System.Drawing.Size(800, 450);
  244. this.m_UIChart.TabIndex = 0;
  245. this.m_UIChart.Text = "uiChart";
  246. //
  247. // ResultWindowWithChart
  248. //
  249. this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
  250. this.ClientSize = new System.Drawing.Size(800, 450);
  251. this.Name = "ResultWindowWithChart";
  252. this.ResumeLayout(false);
  253. }
  254. protected static List<Color> m_Colors = new List<Color>();
  255. /// <summary>
  256. /// 设置颜色
  257. /// </summary>
  258. /// <param name="count"></param>
  259. private static void SetColors(int count = 100)
  260. {
  261. if (m_Colors.Count > 0)
  262. return;
  263. long tick = DateTime.Now.Ticks;
  264. Random ran = new Random((int)(tick & 0xffffffffL) | (int)(tick >> 32));
  265. Random ran2 = new Random((int)(tick & 0xffffffffL) | (int)(tick >> 32));
  266. for (int i = 0; i < count; i++)
  267. {
  268. int R = ran.Next(255);
  269. int G = ran2.Next(255);
  270. int B = 222;
  271. B = (R + G > 400) ? R + G - 400 : B;//0 : 380 - R - G;
  272. B = (B > 255) ? 255 : B;
  273. m_Colors.Add(System.Drawing.Color.FromArgb(R, G, B));
  274. }
  275. }
  276. }
  277. }