RWWithChart.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  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 DataGridView 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. for (int i = 0; i < m_DataGridView.Columns.Count; i++)
  146. {
  147. m_DataGridView.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
  148. m_DataGridView.Columns[i].HeaderText = dt.Columns[i].Caption;
  149. }
  150. }
  151. /// <summary>
  152. /// 将Chart控件添加到界面
  153. /// </summary>
  154. protected virtual void AddChart()
  155. {
  156. m_UIChart.RadiusSides = UICornerRadiusSides.None;
  157. m_UIChart.RectSides = ToolStripStatusLabelBorderSides.None;
  158. this.Controls.Add(this.m_UIChart);
  159. if (this.ShowDataGridView)
  160. m_UIChart.Dock = DockStyle.Top;
  161. else
  162. m_UIChart.Dock = DockStyle.Fill;
  163. }
  164. private void UiSymbolButtonExportToImage_Click(object sender, EventArgs e)
  165. {
  166. ExportToImage(this.m_UIChart);
  167. }
  168. private void UiSymbolButtonExportToExcel_Click(object sender, EventArgs e)
  169. {
  170. ExportToExcel(this.m_DataGridView);
  171. }
  172. /// <summary>
  173. /// 根据实际需要展示的图类型Pie/Bar/Line/BarEx/Doughnut五种创建Chart控件
  174. /// </summary>
  175. protected virtual void CreateChart()
  176. {
  177. }
  178. /// <summary>
  179. /// 设置X轴显示的文字
  180. /// </summary>
  181. /// <returns></returns>
  182. protected virtual string SetXAxisName()
  183. {
  184. return "系列";
  185. }
  186. /// <summary>
  187. /// 设置Y轴显示的文字
  188. /// </summary>
  189. /// <returns></returns>
  190. protected virtual string SetYAxisName()
  191. {
  192. return "值";
  193. }
  194. /// <summary>
  195. /// 设置图例的位置,默认右下角
  196. /// </summary>
  197. protected virtual void SetLegend()
  198. {
  199. m_UIOption.Legend = new UILegend
  200. {
  201. Orient = UIOrient.Horizontal,
  202. Top = UITopAlignment.Bottom,
  203. Left = UILeftAlignment.Right
  204. };
  205. }
  206. /// <summary>
  207. /// 大小改变时修改Chart的大小为总高度的2/3
  208. /// </summary>
  209. /// <param name="e"></param>
  210. protected override void OnSizeChanged(EventArgs e)
  211. {
  212. base.OnSizeChanged(e);
  213. if (m_UIChart == null) return;
  214. this.m_UIChart.Height = 2 * this.Height / 3;
  215. }
  216. /// <summary>
  217. /// 配置当前窗体,并继承自查询结果ResultWindow窗体
  218. /// </summary>
  219. public RWWithChart() : base()
  220. {
  221. CreateExportImageAndExcelButton();
  222. base.uiSymbolButtonExportToExcel.Click += UiSymbolButtonExportToExcel_Click;
  223. base.uiSymbolButtonExportToImage.Click += UiSymbolButtonExportToImage_Click;
  224. CreateChart();
  225. InitializeComponent();
  226. SetColors();
  227. }
  228. private void InitializeComponent()
  229. {
  230. this.SuspendLayout();
  231. //
  232. // uiChart
  233. //
  234. this.m_UIChart.Dock = System.Windows.Forms.DockStyle.Fill;
  235. this.m_UIChart.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(244)))), ((int)(((byte)(244)))), ((int)(((byte)(244)))));
  236. this.m_UIChart.Font = new System.Drawing.Font("微软雅黑", 12F);
  237. this.m_UIChart.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(54)))), ((int)(((byte)(54)))), ((int)(((byte)(54)))));
  238. this.m_UIChart.Location = new System.Drawing.Point(0, 0);
  239. this.m_UIChart.MinimumSize = new System.Drawing.Size(1, 1);
  240. this.m_UIChart.Name = "uiChart";
  241. this.m_UIChart.Size = new System.Drawing.Size(800, 450);
  242. this.m_UIChart.TabIndex = 0;
  243. this.m_UIChart.Text = "uiChart";
  244. //
  245. // ResultWindowWithChart
  246. //
  247. this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
  248. this.ClientSize = new System.Drawing.Size(800, 450);
  249. this.Name = "ResultWindowWithChart";
  250. this.ResumeLayout(false);
  251. }
  252. protected static List<Color> m_Colors = new List<Color>();
  253. /// <summary>
  254. /// 设置颜色
  255. /// </summary>
  256. /// <param name="count"></param>
  257. private static void SetColors(int count = 100)
  258. {
  259. if (m_Colors.Count > 0)
  260. return;
  261. long tick = DateTime.Now.Ticks;
  262. Random ran = new Random((int)(tick & 0xffffffffL) | (int)(tick >> 32));
  263. Random ran2 = new Random((int)(tick & 0xffffffffL) | (int)(tick >> 32));
  264. for (int i = 0; i < count; i++)
  265. {
  266. int R = ran.Next(255);
  267. int G = ran2.Next(255);
  268. int B = 222;
  269. B = (R + G > 400) ? R + G - 400 : B;//0 : 380 - R - G;
  270. B = (B > 255) ? 255 : B;
  271. m_Colors.Add(System.Drawing.Color.FromArgb(R, G, B));
  272. }
  273. }
  274. }
  275. }