65.9K
CodeProject 正在变化。 阅读更多。
Home

Windows 图表应用程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (37投票s)

2011年3月13日

CPOL

3分钟阅读

viewsIcon

169164

downloadIcon

15474

Windows 图表应用程序,使用 Microsoft 图表控件生成图表并将图表图像保存为文件

columnchart.Gif

引言

在我公司工作的 Sharepoint 项目中,我曾被要求创建一个图表 WebPart。我花了相当多的时间来收集开发 WebPart 所需的知识库。最后,我借助 Microsoft charting controls for Visual Studio 2008 来实现这一点。

为了分享我获得的知识,我创建了一个 Windows 应用程序,用于生成各种类型的图表,您可以从组合框中选择。

由于我从各种不同的来源获得了图表知识,我想将它们都集中在一个地方,在一个像 CodeProject 这样被广泛使用的开发者网站上。您可以了解 System.Windows.Forms.DataVisualization.Charting 命名空间中的 Chart 类,以及如何在运行时使用它来生成图表。此外,您还可以看到如何获取 enum 名称集合并将其加载到容器中。在此应用程序中,系统 KnownColor enum 名称被加载到组合框中,以便从 UI 设置窗体和图表区域的颜色,这似乎很有趣。

希望这对图表控件有所帮助。

背景

程序集 System.Windows.Forms.DataVisualization.dllSystem.Web.DataVisualization.dll 在创建 Windows 和 Web 应用程序的图表控件方面做得非常出色。

命名空间

  • System.Windows.Forms.DataVisualization.Charting (用于 Windows)
  • System.Web.UI.DataVisualization.Charting (用于 Web)

提供 Chart 类来创建所需的图表控件。您可以在 这里 下载并安装 Microsoft charting controls 程序集。

Using the Code

使用代码的最佳方式是下载此项目并立即查看代码文件。理解概念并创建您自己的图表控件。我保证这很简单而且很方便。

WindowsCharting 类创建并返回图表控件。下面是该类的源代码

 sealed class WindowsCharting
    {
        //method generates the chart
        #pragma warning disable 0628
        protected internal Chart GenerateChart
	(DataTable dtChartDataSource, int width,int height,string bgColor,int intType )
        {
            Chart chart = new Chart()
            {
                Width = width,
                Height = height
            };
            chart.Legends.Add(new Legend(){Name = "Legend"});
            chart.Legends[0].Docking = Docking.Bottom;
            ChartArea chartArea = new ChartArea() { Name = "ChartArea" };
            //Remove X-axis grid lines
            chartArea.AxisX.MajorGrid.LineWidth = 0;
            //Remove Y-axis grid lines
            chartArea.AxisY.MajorGrid.LineWidth = 0;
            //Chart Area Back Color
            chartArea.BackColor = Color.FromName(bgColor);
            chart.ChartAreas.Add(chartArea);
            chart.Palette = ChartColorPalette.BrightPastel;
            string series = string.Empty;
            //create series and add data points to the series
            if (dtChartDataSource != null)
            {
                foreach (DataColumn dc in dtChartDataSource.Columns)
                {
                    //a series to the chart
                    if (chart.Series.FindByName(dc.ColumnName) == null)
                    {
                        series = dc.ColumnName;
                        chart.Series.Add(series);
                        chart.Series[series].ChartType = (SeriesChartType)intType;
                    }
                    //Add data points to the series
                    foreach (DataRow dr in dtChartDataSource.Rows)
                    {
                        double dataPoint = 0;
                        double.TryParse(dr[dc.ColumnName].ToString(), out dataPoint);
                        DataPoint objDataPoint = new DataPoint() 
		       { AxisLabel = "series", YValues = new double[] { dataPoint } };
                        chart.Series[series].Points.Add(dataPoint);
                    }
                }
            }
            return chart;
        }
    }

在我的密封类中,您可以看到 #pragma 作用于生成图表的 protected 成员。这用于抑制不正确且著名的警告消息“sealed class 中声明了新的 protected 成员”。起初,我想知道我为什么会收到此警告消息,因为我的 protected 成员并没有覆盖其他成员。由于此警告在此处无关紧要,因此已使用 #pragma warning disable 0628 进行抑制。该类成员

protected internal Chart GenerateChart
(DataTable dtChartDataSource, int width,int height,string bgColor,int intType)
{
//Code
}

创建一个 Chart 类的实例,设置实例属性,并将所需的 ChartAreaLegend 添加到 ChartAreasLegends 集合中。如下设置图表网格区域 X 和 Y 轴线的宽度

//Remove X-axis grid lines
chartArea.AxisX.MajorGrid.LineWidth = 0;
//Remove Y-axis grid lines
chartArea.AxisY.MajorGrid.LineWidth = 0;

数据表为要绘制的图表提供数据点。Series 是我们需要图表的参数,而 DataPoint 是相应 X 和 Y 坐标的实际图表绘图点。

将重复的 Chart Series 添加到 ChartArea 会引发

System.Argument

异常。我已循环遍历 DataTable 以创建 Chart Series 的 DataPoint 实例。您可以选择为图表设置 DataSourceDataPoint 成员字段。然后,您可以为 X 轴设置 XValueMemeber 字段或列,并为 Y 轴 datapoint 设置 YValueMember 字段或列。

可以使用 LabelStyle.Format 属性来格式化图表的 X 和 Y 轴标签,例如%,货币(“c”)等。例如,以下代码片段用于在 Y 轴标签上显示百分比(%)

chartArea.AxisY.LabelStyle.Format = "{0;0}" + "%"; 

Y 轴标签的外观如下

format.Gif

在此 Windows 应用程序中,您还可以通过 UI 设置窗体和图表区域的颜色。图表可以以 SeriesChartType 枚举中提供的不同类型进行查看

//Load system knowcolors list to the combo
        private void LoadColors(ComboBox cboControl)
        {
            var systemColors = Enum.GetNames(typeof(KnownColor));
            foreach (string color in systemColors)
            {
                cboControl.Items.Add(color);
            }
            cboControl.SelectedIndex = cboControl.SelectedIndex <= 0 ? 
				1 : cboControl.SelectedIndex;
        }
        //Load chart types list to the combo
        private void LoadChartTypes(ComboBox cboControl)
        {
            var chartTypes = Enum.GetNames(typeof(SeriesChartType));
            foreach (string type in chartTypes)
            {
                cboControl.Items.Add(type);
            }
            cboControl.SelectedIndex = cboControl.SelectedIndex <= 0 ? 
		(int)SeriesChartType.Column : cboControl.SelectedIndex;
        }

获取系统 KnownColor enum 名称

var systemColors = Enum.GetNames(typeof(KnownColor));

变量 systemColors 的类型为 string[],其中包含 KnowColor enum 名称。

Chart 类拥有大量的属性和成员可供配置。

图表支持 3D 视图

chart.ChartAreas[0].Area3DStyle.Enable3D = true;
StackedArea.Gif

SaveFileDialog 的“另存为”类型筛选器生成图表,以 ChartImageFormat enum 中的名称命名

var chartImgFormats = Enum.GetNames(typeof(ChartImageFormat));
string filter = string.Empty;
foreach (string format in chartImgFormats)
{
        filter += format + "(*." + format + ")|*." + format + "|";
}
filter += "All files (*.*)|*.*";
saveFileDialog.Filter = filter;

关注点

  • 运行时生成图表
  • 运行时更改系统 KnowColor 的外观和风格

结论

希望大家都能喜欢这个应用程序,并且源代码对有需要的人有所帮助。

如果您觉得本文有用,请投票。

© . All rights reserved.