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));
}
}
}
}