using Sunny.UI; using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Windows.Forms; namespace WWPipeLine.MapBasic.Results { public class RWWithChart : ResultWindow { /// /// DataGridView控件 /// protected UIDataGridView m_DataGridView; /// /// UIChart控件 /// protected UIChart m_UIChart; /// /// UIChart的Option属性 /// protected UIOption m_UIOption; /// /// Chart类型,默认为Bar /// protected UIChartType m_ChartType = UIChartType.Bar; /// /// 默认的Chart标题 /// protected string m_ChartTitle = "统计结果"; /// /// 是否显示表格DataGridView,默认显示 /// protected bool ShowDataGridView = true; /// /// 设置Chart图的标题 /// protected virtual string ChartTitle { get => m_ChartTitle; set => m_ChartTitle = value; } /// /// 图表类型 /// public enum UIChartType { /// /// 柱状图 /// Bar, /// /// 折线图 /// Line, /// /// 饼图 /// Pie, /// /// 扩展后的柱状图 /// BarEx, /// /// 跑道图 /// Doughnut } /// /// 设置图表内容。包括数值、颜色等 /// /// protected virtual void AddOptionSeries(DataTable dt) { } /// /// 设置X轴的列名 /// /// protected virtual void AddXAxis(DataTable dt) { } /// /// 设置图例的内容 /// /// protected virtual void SetLegendItem(DataTable dt) { } /// /// 设置Chart的Option的扩展信息 /// protected virtual void SetOptionEx() { } /// /// 根据传入的数据显示Chart图和表格 /// /// public override void ShowData(object data) { if (!(data is DataTable)) { Sunny.UI.UIMessageTip.ShowWarning("数据错误,未能显示图表"); return; } var dt = data as DataTable; if (ShowDataGridView) { this.CreateDataGridView(dt); } AddChart(); //将Chart控件添加到界面 m_UIOption.Title = new UITitle { Text = ChartTitle }; AddOptionSeries(dt);//设置图表内容,包括数值、颜色等 AddXAxis(dt);//设置X轴的列名 SetLegend();//设置图例的位置 SetLegendItem(dt);//设置图例的内容 SetOptionEx();//设置Chart的Option的扩展信息 this.m_UIChart.SetOption(m_UIOption); } /// /// 创建DataGridView控件并绑定数据源到DataTable /// /// protected virtual void CreateDataGridView(DataTable dt) { if (m_DataGridView == null) { m_DataGridView = new Sunny.UI.UIDataGridView { Dock = DockStyle.Fill, AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill, SelectionMode = DataGridViewSelectionMode.FullRowSelect, DefaultCellStyle = new DataGridViewCellStyle() { ForeColor = Color.Black, Alignment = DataGridViewContentAlignment.MiddleCenter }, ShowEditingIcon = false, ShowCellToolTips = false, AllowUserToAddRows = false, AllowUserToResizeRows = false, AllowUserToDeleteRows = false, AllowUserToOrderColumns = false, ReadOnly = true, MultiSelect = false, BorderStyle = BorderStyle.None, CellBorderStyle = DataGridViewCellBorderStyle.None, RowHeadersVisible = false }; this.Controls.Add(m_DataGridView); } m_DataGridView.DataSource = dt; if (System.Text.RegularExpressions.Regex.IsMatch(dt.TableName?.ToString(), @"[\u4e00-\u9fa5]")) this.m_DataGridView.Tag = dt.TableName?.ToString(); for (int i = 0; i < m_DataGridView.Columns.Count; i++) { m_DataGridView.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable; m_DataGridView.Columns[i].HeaderText = dt.Columns[i].Caption; } } /// /// 将Chart控件添加到界面 /// protected virtual void AddChart() { m_UIChart.RadiusSides = UICornerRadiusSides.None; m_UIChart.RectSides = ToolStripStatusLabelBorderSides.None; this.Controls.Add(this.m_UIChart); if (this.ShowDataGridView) m_UIChart.Dock = DockStyle.Top; else m_UIChart.Dock = DockStyle.Fill; } private void UiSymbolButtonExportToImage_Click(object sender, EventArgs e) { ExportToImage(this.m_UIChart); } private void UiSymbolButtonExportToExcel_Click(object sender, EventArgs e) { ExportToExcel(this.m_DataGridView); } /// /// 根据实际需要展示的图类型Pie/Bar/Line/BarEx/Doughnut五种创建Chart控件 /// protected virtual void CreateChart() { } /// /// 设置X轴显示的文字 /// /// protected virtual string SetXAxisName() { return "系列"; } /// /// 设置Y轴显示的文字 /// /// protected virtual string SetYAxisName() { return "值"; } /// /// 设置图例的位置,默认右下角 /// protected virtual void SetLegend() { m_UIOption.Legend = new UILegend { Orient = UIOrient.Horizontal, Top = UITopAlignment.Bottom, Left = UILeftAlignment.Right }; } /// /// 大小改变时修改Chart的大小为总高度的2/3 /// /// protected override void OnSizeChanged(EventArgs e) { base.OnSizeChanged(e); if (m_UIChart == null) return; this.m_UIChart.Height = 2 * this.Height / 3; } /// /// 配置当前窗体,并继承自查询结果ResultWindow窗体 /// public RWWithChart() : base() { CreateExportImageAndExcelButton(); base.uiSymbolButtonExportToExcel.Click += UiSymbolButtonExportToExcel_Click; base.uiSymbolButtonExportToImage.Click += UiSymbolButtonExportToImage_Click; CreateChart(); InitializeComponent(); SetColors(); } private void InitializeComponent() { this.SuspendLayout(); // // uiChart // this.m_UIChart.Dock = System.Windows.Forms.DockStyle.Fill; this.m_UIChart.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(244)))), ((int)(((byte)(244)))), ((int)(((byte)(244))))); this.m_UIChart.Font = new System.Drawing.Font("微软雅黑", 12F); this.m_UIChart.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(54)))), ((int)(((byte)(54)))), ((int)(((byte)(54))))); this.m_UIChart.Location = new System.Drawing.Point(0, 0); this.m_UIChart.MinimumSize = new System.Drawing.Size(1, 1); this.m_UIChart.Name = "uiChart"; this.m_UIChart.Size = new System.Drawing.Size(800, 450); this.m_UIChart.TabIndex = 0; this.m_UIChart.Text = "uiChart"; // // ResultWindowWithChart // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.ClientSize = new System.Drawing.Size(800, 450); this.Name = "ResultWindowWithChart"; this.ResumeLayout(false); } protected static List m_Colors = new List(); /// /// 设置颜色 /// /// private static void SetColors(int count = 100) { if (m_Colors.Count > 0) return; long tick = DateTime.Now.Ticks; Random ran = new Random((int)(tick & 0xffffffffL) | (int)(tick >> 32)); Random ran2 = new Random((int)(tick & 0xffffffffL) | (int)(tick >> 32)); for (int i = 0; i < count; i++) { int R = ran.Next(255); int G = ran2.Next(255); int B = 222; B = (R + G > 400) ? R + G - 400 : B;//0 : 380 - R - G; B = (B > 255) ? 255 : B; m_Colors.Add(System.Drawing.Color.FromArgb(R, G, B)); } } } }