在winform中绘图

简介: 在winform中绘图

今天跟大家分享一下最近做的一个程序中绘图功能的实现。

先来看看实现的效果:

具体实现

页面的设计

绘图设置页面的设计如下所示:

4个label控件,控件如下所示:

2个DateEdit控件,控件如下所示:

1个ComboBoxEdit控件,控件如下所示:

1个CheckedListBoxControl控件,控件如下所示:

1个SimpleButton控件,控件如下所示:

绘图展示的页面设计如下:

只有一个ChartControl控件,控件如下所示:

代码

绘图的数据是之前文章提过的使用C#实现爬虫获取网页数据得到的数据,如下所示:

这些数据中只用了最低温度、最高温度、最低能见度、最高能见度来绘图。

第一步实现加载窗体时获取ComboBoxEdit与CheckedListBoxControl中的内容:

public void init()
 {
     // 为下拉框框赋值
     var comboBoxItems = db.Queryable<WeatherData>().Select(x => x.StationName).Distinct().ToList();
     comboBoxEdit1.Properties.Items.AddRange(comboBoxItems);
     comboBoxEdit2.Properties.Items.AddRange(comboBoxItems);
     // 多选框的设置
     checkedListBoxControl1.CheckOnClick = true; // 设置为单击即选中或取消选中
     // 多选框中的值
     string[] indexs = { "最低温度(℃)", "最高温度(℃)", "最低可见度(km)", "最高可见度(km)" };
     // 多选框添加项
     var checkedItems = new List<CheckedListBoxItem>();
     foreach (var index in indexs)
     {
         var checkedItem = new CheckedListBoxItem();
         checkedItem.Value = index;
         checkedItems.Add(checkedItem);
     }
     checkedListBoxControl1.Items.AddRange(checkedItems.ToArray());
 }
 private void ToolbarForm1_Load(object sender, EventArgs e)
 {
     init();
 }


获取不同的站名:

var comboBoxItems = db.Queryable<WeatherData>()
                       .Select(x => x.StationName).Distinct().ToList();


为下拉框添加值:

comboBoxEdit1.Properties.Items.AddRange(comboBoxItems);


为多选框添加值:

// 多选框的设置
     checkedListBoxControl1.CheckOnClick = true; // 设置为单击即选中或取消选中
     // 多选框中的值
     string[] indexs = { "最低温度(℃)", "最高温度(℃)", "最低可见度(km)", "最高可见度(km)" };
     // 多选框添加项
     var checkedItems = new List<CheckedListBoxItem>();
     foreach (var index in indexs)
     {
         var checkedItem = new CheckedListBoxItem();
         checkedItem.Value = index;
         checkedItems.Add(checkedItem);
     }
     checkedListBoxControl1.Items.AddRange(checkedItems.ToArray());

   

开始绘图按钮的点击事件代码:

private void simpleButton3_Click(object sender, EventArgs e)
 {
     var date1 = dateEdit3.EditValue;
     var date2 = dateEdit4.EditValue;
     var name = comboBoxEdit2.Text;
     var checkedItems = checkedListBoxControl1.CheckedItems;
     if (date1 != null && date2 != null && name != "" && checkedItems.Count != 0)
     {
         var startDate = Convert.ToDateTime(date1);
         var endDate = Convert.ToDateTime(date2);
         var list = db.Queryable<WeatherData>().Where(x => x.Date >= startDate && x.Date < endDate.AddDays(1) && x.StationName == name).ToList();
         // 清空之前的图
         if (chartControl2.Series.Count > 0)
         {
             chartControl2.Series.Clear();
         }
         // 选中几个指标就画几个图
         foreach (CheckedListBoxItem item in checkedItems)
         {
             var indexKey = item.Value.ToString();
             switch (indexKey)
             {
                 case "最低温度(℃)":
                     Series series1 = new Series("最低温度(℃)", ViewType.Line);
                     foreach (var dataPoint in list)
                     {
                         series1.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Tem_Low));
                     }
                     chartControl2.Series.Add(series1);
                     break;
                 case "最高温度(℃)":
                     Series series2 = new Series("最高温度(℃)", ViewType.Line);
                     foreach (var dataPoint in list)
                     {
                         series2.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Tem_High));
                     }
                     chartControl2.Series.Add(series2);
                     break;
                 case "最低可见度(km)":
                     Series series3 = new Series("最低可见度(km)", ViewType.Line);
                     foreach (var dataPoint in list)
                     {
                         series3.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Visibility_Low));
                     }
                     chartControl2.Series.Add(series3);
                     break;
                 case "最高可见度(km)":
                     Series series4 = new Series("最高可见度(km)", ViewType.Line);
                     foreach (var dataPoint in list)
                     {
                         series4.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Visibility_High));
                     }
                     chartControl2.Series.Add(series4);
                     break;
             }
         }
         // 绘图完成提示
         MessageBox.Show("绘图已完成");
     }
     else
     {
         MessageBox.Show("请检查开始日期、结束日期、站名和绘图指标是否都已填写!!!");
     }
 }


数据查询:

var list = db.Queryable<WeatherData>().Where(x => x.Date >= startDate && x.Date < endDate.AddDays(1) && x.StationName == name).ToList();


这里获取时间范围内的数据不用var list = db.Queryable<WeatherData>().Where(x => x.Date >= startDate && x.Date <=endDate && x.StationName == name).ToList();的原因是比如我选择的是2023-11-1到2023-11-15之间的数据,如下所示:

获取的数据,如下所示:

并没有获取到2023-11-15数据,是因为我们要获取的是2023-11-14511:00 与2023-11-15 17:00的数据,因此可以选择使用DateTime.AddDays(1)的方法解决,如下所示:

绘图:

这里考虑的是选择几个指标就画几个图,因此可以使用switch case实现:

switch (indexKey)
             {
                 case "最低温度(℃)":
                     Series series1 = new Series("最低温度(℃)", ViewType.Line);
                     foreach (var dataPoint in list)
                     {
                         series1.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Tem_Low));
                     }
                     chartControl2.Series.Add(series1);
                     break;
                 case "最高温度(℃)":
                     Series series2 = new Series("最高温度(℃)", ViewType.Line);
                     foreach (var dataPoint in list)
                     {
                         series2.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Tem_High));
                     }
                     chartControl2.Series.Add(series2);
                     break;
                 case "最低可见度(km)":
                     Series series3 = new Series("最低可见度(km)", ViewType.Line);
                     foreach (var dataPoint in list)
                     {
                         series3.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Visibility_Low));
                     }
                     chartControl2.Series.Add(series3);
                     break;
                 case "最高可见度(km)":
                     Series series4 = new Series("最高可见度(km)", ViewType.Line);
                     foreach (var dataPoint in list)
                     {
                         series4.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Visibility_High));
                     }
                     chartControl2.Series.Add(series4);
                     break;
             }


绘图代码:

Series series1 = new Series("最低温度(℃)", ViewType.Line);
                     foreach (var dataPoint in list)
                     {
                         series1.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Tem_Low));
                     }
                     chartControl2.Series.Add(series1);


最后的绘图效果如下所示:

以上就是在本案例中在winform中绘图的实现过程,希望对你有所帮助。

目录
相关文章
|
C# 开发者 Windows
WPF技术之图形系列Path控件
WPF Path是Windows Presentation Foundation (WPF)框架中的一个标记元素,用于绘制复杂的几何路径形状。它可以通过设置一系列的路径命令以及相应的参数来定义形状,可以绘制任意复杂度的路径。
1267 0
|
移动开发 C# HTML5
WPF实现图表绘制
WPF实现图表绘制
WPF实现图表绘制
WPF-3D图形
WPF的3D功能可以在不编写任何c#代码的情况下进行绘制,只需要使用xaml即可完成3D图形的渲染。本文主要讲述了WPF-3D中的关键概念, 以及常用到的命中测试、2d控件如何在3D对象中进行渲染,除此之外,还演示了如何导入外部3D模型。
205 0
|
C# Windows
WPF绘图
添加一个绘图面板项目按右键添加类DrawingPanel using System; using System.Collections.Generic; using System.Linq; using System.
1380 0
|
C#
使用WPF创建画图箭头
原文:使用WPF创建画图箭头 今天要给leader line画个箭头,所以就google一下,找到下面的文章,写的不错,可以实现我的需求,所以就摘录下来。
1639 0
|
C# 算法
WPF3D绘图的基础
原文:WPF3D绘图的基础 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37591671/article/details/69487096 1.二维与三维坐标系区别: WPF中二维图形的坐标系将原点定位在呈现区域(通常是屏幕)的左上角。
1250 0
|
前端开发 C#
WPF 实现拖动工具箱效果
原文:WPF 实现拖动工具箱效果     1.效果   点击左边的矩形拖动到右边canvas面板,右边面板添加矩形  2.布局  左边是个StockPanel,上面有个矩形,右边是个Canvas面板。
2065 0
|
算法 C#
WPF特效-绘图
原文:WPF特效-绘图                  WPF玩起来还是挺炫酷的。我实现的效果:不同色块交叉,交叉部分颜色叠加显示。
1264 0
|
C#
WPF绘制简单常用的Path
原文:WPF绘制简单常用的Path 写代码出身的我们经常需要使用一些简单 但是不是规则图形的Path 但限于美工功底有限 不知道怎么去画 下面我告诉大家一些简单的小技巧 用代码来画Path 个人还是比较喜欢用代码 因为数值控制的更精细   MSDN告诉我们,Path可以用这些形状绘制: ArcSegment 类 表示两点之间的一条椭圆弧。
2229 0

热门文章

最新文章