DevExpress之ChartControl用法

DevExpress是一家专门提供高效、直观且用户友好的组件库的公司,可以大大提高项目开发的效率和质量。其中,ChartControl组件是DevExpress中非常常用的组件之一,它可以展示各种形式的图标,包括柱状图、折线图、饼图、散点图等等。本文将为大家详细介绍DevExpress中ChartControl的用法,并配以案例说明,帮助大家更好地使用这个组件。

1. ChartControl的引入方法

首先,需要在项目的引用中添加DevExpress的组件库,这可以通过NuGet软件包管理器或手动添加dll文件实现。此外,还需要在项目代码中添加DevExpress命名空间:

```csharp

using DevExpress.XtraCharts;

```

2. 基本用法

接下来,让我们看一下使用DevExpress ChartControl展示一个简单的折线图的例子。首先,在窗体上添加一个ChartControl组件,并在代码中初始化:

```csharp

private void Form1_Load(object sender, EventArgs e)

{

ChartControl chartControl1 = new ChartControl();

this.Controls.Add(chartControl1);

}

```

然后,将数据添加到ChartControl对象的Series集合中,并设定X和Y轴的标题以及数据源:

```csharp

//创建一个Series集合

Series series1 = new Series("Series1", ViewType.Line);

//添加数据

series1.Points.Add(new SeriesPoint("A", 10));

series1.Points.Add(new SeriesPoint("B", 20));

series1.Points.Add(new SeriesPoint("C", 30));

//添加到ChartControl对象的Series集合中

chartControl1.Series.Add(series1);

//设置X轴标题

((XYDiagram)chartControl1.Diagram).AxisX.Title.Text = "X轴";

//设置Y轴标题

((XYDiagram)chartControl1.Diagram).AxisY.Title.Text = "Y轴";

```

运行程序后,可以看到一个简单的折线图已经出现在窗体上了。

3. 高级用法

以上是一个最基本的ChartControl的用法,但是在实际开发过程中,会遇到更复杂、更灵活的需求,因此需要掌握更高级的用法去满足这些需求。

3.1 动态数据显示

在实际开发中,通常需要动态地显示某项数据的变化,此时就需要使用ChartControl组件的重绘功能来实现动态图表的效果。

首先,准备一份数据源作为ChartControl的数据模型,这里数据模型是一个包含时间和数值的类:

```csharp

public class ChartModel

{

public DateTime Date { get; set; }

public double Value { get; set; }

}

```

然后,设置ChartControl对象的基本属性:

```csharp

//创建一个ChartControl对象

ChartControl chartControl1 = new ChartControl();

//设置图表类型

Series series1 = new Series("Value", ViewType.Line);

chartControl1.Series.Add(series1);

//设置X轴的类型和显示格式

((XYDiagram)chartControl1.Diagram).AxisX.DateTimeGridAlignment = DateTimeMeasurementUnit.Hour;

((XYDiagram)chartControl1.Diagram).AxisX.DateTimeMeasureUnit = DateTimeMeasurementUnit.Second;

((XYDiagram)chartControl1.Diagram).AxisX.Label.TextPattern = "HH:mm:ss";

((XYDiagram)chartControl1.Diagram).AxisX.Title.Text = "时间(秒钟)";

//设置Y轴的类型和显示范围

((XYDiagram)chartControl1.Diagram).AxisY.WholeRange.MinValue = 0;

((XYDiagram)chartControl1.Diagram).AxisY.WholeRange.MaxValue = 100;

((XYDiagram)chartControl1.Diagram).AxisY.Title.Text = "值";

//将ChartControl对象添加到窗体上

this.Controls.Add(chartControl1);

```

接下来,创建一个定时器,并在每个时间间隔内获取一个随机值,然后将它添加到数据源中并重新绘制图表:

```csharp

//创建一个Timer对象

Timer timer1 = new Timer();

timer1.Interval = 1000;

timer1.Enabled = true;

//设置定时器的Tick事件

timer1.Tick += (sender, e) =>

{

Random random = new Random();

double value = random.Next(0, 100);

//将新的数据点添加到Series集合中

chartControl1.Series[0].Points.Add(new SeriesPoint(DateTime.Now, value));

if (chartControl1.Series[0].Points.Count > 10)

{

//如果数据点数量超出了10个,则将最早的数据点删除

chartControl1.Series[0].Points.RemoveAt(0);

}

//重绘图表

chartControl1.RefreshData();

};

```

通过以上代码,可以在窗体上看到一个动态的折线图,它会每秒钟刷新一次数据,从而实现动态显示的效果。

3.2 自定义图表主题

DevExpress ChartControl提供了大量主题可供选择,不过可能会遇到只需要个性化定制的情况,此时可以使用自定义图表主题功能来实现。

首先,选择一款喜欢的DevExpress主题,然后通过它来生成自定义主题:

```csharp

//创建一个DevExpress主题对象

DevExpress.XtraCharts.DefaultLookAndFeel defaultLookAndFeel1 = new DevExpress.XtraCharts.DefaultLookAndFeel();

defaultLookAndFeel1.LookAndFeel.SkinName = "Office 2016 Colorful";

//获取主题样式

var theme = defaultLookAndFeel1.LookAndFeel.GetVisualStyle();

//创建一个新的主题

Theme customTheme = new Theme("Custom Theme", theme);

//修改主题的颜色

foreach (var item in customTheme.GetColorizers())

{

if (item is PaletteColorizer)

{

PaletteColorizer colorizer = (PaletteColorizer)item;

colorizer.ClearColors();

colorizer.AddColor(Color.FromArgb(0x17, 0x3E, 0x8D));

colorizer.AddColor(Color.FromArgb(0x80, 0xBA, 0xCF));

colorizer.AddColor(Color.FromArgb(0x00, 0x60, 0x97));

}

}

//将新主题添加到DevExpress主题之中,并应用到图表控件的主题之中

DevExpress.XtraCharts.XtraChartsThemes.AppendTheme(customTheme);

chartControl1.LookAndFeel.Assign(customTheme);

```

通过以上代码,可以生成一款自定义的DevExpress主题,并将其应用到ChartControl对象上。

3.3 实现复杂图表

在实际开发过程中,可能会需要使用ChartControl组件展示更为复杂的图表,例如多个不同的图形混合展示、分组展示等等。

3.3.1 多个不同的图形混合展示

在实际开发中,常需要将多个不同类型的图形混合在一起展示,例如将柱状图和折线图混合展示,此时可以使用DevExpress ChartControl实现。

首先,需要将要展示的数据源绑定到ChartControl对象的不同Series集合中:

```csharp

//绑定数据源

List dataSource = GetData();

Series lineSeries = new Series("成交量占比", ViewType.Line);

Series barSeries = new Series("销售量", ViewType.Bar);

lineSeries.ArgumentDataMember = "ProductName";

lineSeries.ValueDataMembers[0] = "SellTotalPercent";

barSeries.ArgumentDataMember = "ProductName";

barSeries.ValueDataMembers[0] = "SellTotal";

chartControl1.Series.AddRange(new Series[] { lineSeries, barSeries });

chartControl1.DataSource = dataSource;

```

然后,设置ChartControl对象的各种属性:

```csharp

//设置条形图X轴和Y轴的标题

((XYDiagram)chartControl1.Diagram).AxisX.Title.Text = "产品名称";

((XYDiagram)chartControl1.Diagram).AxisY.Title.Text = "销售量";

//添加第二个Y轴,并将它绑定到曲线图上

SecondaryAxisY secondaryAxisY1 = new SecondaryAxisY("曲线轴");

((XYDiagram)chartControl1.Diagram).SecondaryAxesY.Add(secondaryAxisY1);

lineSeries.AxisY = secondaryAxisY1;

((XYDiagram)chartControl1.Diagram).AxisY.WholeRange.AlwaysShowZeroLevel = false;

((XYDiagram)chartControl1.Diagram).AxisY.WholeRange.Auto = true;

//设置条形图的样式

BarSeriesView barSeriesView1 = new BarSeriesView();

barSeriesView1.FillStyle.FillMode = FillMode.Solid;

barSeriesView1.Color = Color.FromArgb(0x1B, 0xA1, 0xE2);

barSeriesView1.Transparency = 0;

barSeriesView1.Border.Visibility = DevExpress.Utils.DefaultBoolean.False;

barSeriesView1.Shadow.Size = 0;

barSeriesView1.LabelsVisibility = DevExpress.Utils.DefaultBoolean.True;

barSeries.View = barSeriesView1;

//设置曲线图的样式和属性

lineSeries.ArgumentScaleType = ScaleType.Qualitative;

lineSeries.LabelsVisibility = DevExpress.Utils.DefaultBoolean.True;

lineSeries.ArgumentScaleType = ScaleType.Qualitative;

((LineSeriesView)lineSeries.View).LineStyle.DashStyle = DashStyle.Dash;

((LineSeriesView)lineSeries.View).Color = Color.FromArgb(0xC0, 0x18, 0x57);

lineSeries.Visible = true;

lineSeries.View.Color = Color.FromArgb(60, 0xC0, 0x18, 0x57);

((LineSeriesView)lineSeries.View).MarkerVisibility = DevExpress.Utils.DefaultBoolean.True;

((LineSeriesView)lineSeries.View).MarkerSize = 20;

//设置曲线图数据点标签样式

((LineSeriesView)lineSeries.View).Label.TextPattern = "{V}%";

//重新排列条形图和曲线图

BarDrawOptions barDrawOptions1 = new BarDrawOptions((XYDiagram)chartControl1.Diagram);

((XYDiagram)chartControl1.Diagram).PaneLayoutDirection = PaneLayoutDirection.Horizontal;

barDrawOptions1.ContentAnimation = DevExpress.XtraCharts.ContentAnimationType.Wave;

barDrawOptions1.ColorMode = DevExpress.XtraCharts.BarColorMode.Standard;

barSeries.DrawOptions = barDrawOptions1;

chartControl1.CrosshairEnabled = DevExpress.Utils.DefaultBoolean.False;

```

最后,在窗体上显示图表:

```csharp

//创建一个ChartControl对象

ChartControl chartControl1 = new ChartControl();

chartControl1.Dock = DockStyle.Fill;

//设置图表标题

chartControl1.Titles.Add(new ChartTitle());

chartControl1.Titles[0].Text = "华东地区销售量分析";

//设置多个Series实例的柱状图和曲线图混合展示

List dataSource = GetData();

Series lineSeries = new Series("成交量占比", ViewType.Line);

Series barSeries = new Series("销售量", ViewType.Bar);

lineSeries.ArgumentDataMember = "ProductName";

lineSeries.ValueDataMembers[0] = "SellTotalPercent";

barSeries.ArgumentDataMember = "ProductName";

barSeries.ValueDataMembers[0] = "SellTotal";

chartControl1.Series.AddRange(new Series[] { lineSeries, barSeries });

chartControl1.DataSource = dataSource;

//设置条形图X轴和Y轴的标题

((XYDiagram)chartControl1.Diagram).AxisX.Title.Text = "产品名称";

((XYDiagram)chartControl1.Diagram).AxisY.Title.Text = "销售量";

//添加第二个Y轴,并将它绑定到曲线图上

SecondaryAxisY secondaryAxisY1 = new SecondaryAxisY("曲线轴");

((XYDiagram)chartControl1.Diagram).SecondaryAxesY.Add(secondaryAxisY1);

lineSeries.AxisY = secondaryAxisY1;

((XYDiagram)chartControl1.Diagram).AxisY.WholeRange.AlwaysShowZeroLevel = false;

((XYDiagram)chartControl1.Diagram).AxisY.WholeRange.Auto = true;

//设置条形图的样式

BarSeriesView barSeriesView1 = new BarSeriesView();

barSeriesView1.FillStyle.FillMode = FillMode.Solid;

barSeriesView1.Color = Color.FromArgb(0x1B, 0xA1, 0xE2);

barSeriesView1.Transparency = 0;

barSeriesView1.Border.Visibility = DevExpress.Utils.DefaultBoolean.False;

barSeriesView1.Shadow.Size = 0;

barSeriesView1.LabelsVisibility = DevExpress.Utils.DefaultBoolean.True;

barSeries.View = barSeriesView1;

//设置曲线图的样式和属性

lineSeries.ArgumentScaleType = ScaleType.Qualitative;

lineSeries.LabelsVisibility = DevExpress.Utils.DefaultBoolean.True;

lineSeries.ArgumentScaleType = ScaleType.Qualitative;

((LineSeriesView)lineSeries.View).LineStyle.DashStyle = DashStyle.Dash;

((LineSeriesView)lineSeries.View).Color = Color.FromArgb(0xC0, 0x18, 0x57);

lineSeries.Visible = true;

lineSeries.View.Color = Color.FromArgb(60, 0xC0, 0x18, 0x57);

((LineSeriesView)lineSeries.View).MarkerVisibility = DevExpress.Utils.DefaultBoolean.True;

((LineSeriesView)lineSeries.View).MarkerSize = 20;

//设置曲线图数据点标签样式

((LineSeriesView)lineSeries.View).Label.TextPattern = "{V}%";

//重新排列条形图和曲线图

BarDrawOptions barDrawOptions1 = new BarDrawOptions((XYDiagram)chartControl1.Diagram);

((XYDiagram)chartControl1.Diagram).PaneLayoutDirection = PaneLayoutDirection.Horizontal;

barDrawOptions1.ContentAnimation = DevExpress.XtraCharts.ContentAnimationType.Wave;

barDrawOptions1.ColorMode = DevExpress.XtraCharts.BarColorMode.Standard;

barSeries.DrawOptions = barDrawOptions1;

chartControl1.CrosshairEnabled = DevExpress.Utils.DefaultBoolean.False;

this.Controls.Add(chartControl1);

```

通过以上代码,可以在窗体上看到两个不同类型的图形混合在一起展示的图表。

3.3.2 分组展示

有时候需要将数据按照某种分类属性分组展示,此时可以使用ChartControl组件的分组展示功能。

首先,准备一份分组数据源,在其中指定每个数据项的分类属性值:

```csharp

public class GroupInfo

{

public string Year { get; set; }

public string Quarter { get; set; }

public string Month { get; set; }

public int Value { get; set; }

}

private List GetData()

{

Random random = new Random();

List data = new List();

for (int i = 2019; i <= 2021; i++)

{

for (int j = 1; j <= 4; j++)

{

for (int k = 1; k <= 12; k++)

{

data.Add(new GroupInfo()

{

Year = i.ToString(),

Quarter = $"第{j}季度",

Month = $"{k}月",

Value = random.Next(0, 100)

});

}

}

}

return data;

}

```

然后,绑定数据源并指定每个Series集合的分类属性:

```csharp

//绑定数据源

List dataSource = GetData();

Series series = new Series("Value", ViewType.Bar);

series.ArgumentDataMember = "Month";

series.ValueDataMembers[0] = "Value";

ChartControl chartControl1 = new ChartControl();

chartControl1.Series.Add(series);

chartControl1.DataSource = dataSource;

chartControl1.Dock = DockStyle.Fill;

//添加第二个分类属性

Series series2 = new Series("Value", ViewType.Line);

series2.ArgumentDataMember = "Quarter";

series2.ValueDataMembers[0] = "Value";

SeriesViewBase view2 = series2.View;

view2.Color = Color.Red;

((LineSeriesView)view2).LineStyle.DashStyle = DashStyle.DashDotDot;

chartControl1.Series.Add(series2);

//设置第一个分类属性的AxisX,第二个分类属性的AxisY

XYDiagram diagram = (XYDiagram)chartControl1.Diagram;

AxisX axisX1 = diagram.AxisX;

((BarSeriesView)series.View).AxisX = axisX1;

AxisX axisX2 = new AxisX("Quarter Axis");

((XYDiagram)chartControl1.Diagram).SecondaryAxesX.Add(axisX2);

((LineSeriesView)view2).AxisX = axisX2;

axisX2.Visible = true;

//设置图表显示范围

AxisY axisY1 = diagram.AxisY;

AxisY axisY2 = new SecondaryAxisY("Secondary Axis Y");

((XYDiagram)chartControl1.Diagram).SecondaryAxesY.Add(axisY2);

//设置坐标轴的标题

axisX1.Title.Text = "销售月份";

axisY1.Title.Text = "销售金额";

axisY2.Title.Text = "销售金额占比";

//设置第二个Series集合的坐标轴和显示范围

series2.AxisY = axisY2;

axisY2.Alignment = AxisAlignment.Near;

((XYDiagram)chartControl1.Diagram).AxisY.WholeRange.Auto = true;

axisY2.WholeRange.Auto = true;

axisY1.WholeRange.Auto = true;

```

最后,在窗体上显示

壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。

我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!

点赞(52) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部