上宝 发表于 2023-12-1 19:09:45

在winform中绘图

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

具体实现

页面的设计

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

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

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

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

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

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

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

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

代码

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

这些数据中只用了最低温度、最高温度、最低能见度、最高能见度来绘图。
第一步实现加载窗体时获取ComboBoxEdit与CheckedListBoxControl中的内容:
public void init()<br> {<br>     // 为下拉框框赋值<br>     var comboBoxItems = db.Queryable<WeatherData>().Select(x => x.StationName).Distinct().ToList();<br>     comboBoxEdit1.Properties.Items.AddRange(comboBoxItems);<br>     comboBoxEdit2.Properties.Items.AddRange(comboBoxItems);<br>​<br>     // 多选框的设置<br>     checkedListBoxControl1.CheckOnClick = true; // 设置为单击即选中或取消选中<br>​<br>     // 多选框中的值<br>     string[] indexs = { "最低温度(℃)", "最高温度(℃)", "最低可见度(km)", "最高可见度(km)" };<br>     // 多选框添加项<br>     var checkedItems = new List<CheckedListBoxItem>();<br>     foreach (var index in indexs)<br>     {<br>         var checkedItem = new CheckedListBoxItem();<br>         checkedItem.Value = index;<br>         checkedItems.Add(checkedItem);<br>     }<br>     checkedListBoxControl1.Items.AddRange(checkedItems.ToArray());<br>​<br> }<br> private void ToolbarForm1_Load(object sender, EventArgs e)<br> {<br>     init();<br> }获取不同的站名:
var comboBoxItems = db.Queryable<WeatherData>()<br>                       .Select(x => x.StationName).Distinct().ToList();为下拉框添加值:
 comboBoxEdit1.Properties.Items.AddRange(comboBoxItems);为多选框添加值:
    // 多选框的设置<br>     checkedListBoxControl1.CheckOnClick = true; // 设置为单击即选中或取消选中<br>​<br>     // 多选框中的值<br>     string[] indexs = { "最低温度(℃)", "最高温度(℃)", "最低可见度(km)", "最高可见度(km)" };<br>     // 多选框添加项<br>     var checkedItems = new List<CheckedListBoxItem>();<br>     foreach (var index in indexs)<br>     {<br>         var checkedItem = new CheckedListBoxItem();<br>         checkedItem.Value = index;<br>         checkedItems.Add(checkedItem);<br>     }<br>     checkedListBoxControl1.Items.AddRange(checkedItems.ToArray());开始绘图按钮的点击事件代码:
private void simpleButton3_Click(object sender, EventArgs e)<br> {<br>     var date1 = dateEdit3.EditValue;<br>     var date2 = dateEdit4.EditValue;<br>     var name = comboBoxEdit2.Text;<br>     var checkedItems = checkedListBoxControl1.CheckedItems;<br>     if (date1 != null && date2 != null && name != "" && checkedItems.Count != 0)<br>     {<br>         var startDate = Convert.ToDateTime(date1);<br>         var endDate = Convert.ToDateTime(date2);<br>         var list = db.Queryable<WeatherData>().Where(x => x.Date >= startDate && x.Date < endDate.AddDays(1) && x.StationName == name).ToList();<br>         // 清空之前的图<br>         if (chartControl2.Series.Count > 0)<br>         {<br>             chartControl2.Series.Clear();<br>         }<br>         // 选中几个指标就画几个图<br>         foreach (CheckedListBoxItem item in checkedItems)<br>         {<br>             var indexKey = item.Value.ToString();<br>             switch (indexKey)<br>             {<br>                 case "最低温度(℃)":<br>                     Series series1 = new Series("最低温度(℃)", ViewType.Line);<br>                     foreach (var dataPoint in list)<br>                     {<br>                         series1.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Tem_Low));<br>​<br>                     }<br>                     chartControl2.Series.Add(series1);<br>                     break;<br>                 case "最高温度(℃)":<br>                     Series series2 = new Series("最高温度(℃)", ViewType.Line);<br>                     foreach (var dataPoint in list)<br>                     {<br>                         series2.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Tem_High));<br>​<br>                     }<br>                     chartControl2.Series.Add(series2);<br>                     break;<br>                 case "最低可见度(km)":<br>                     Series series3 = new Series("最低可见度(km)", ViewType.Line);<br>                     foreach (var dataPoint in list)<br>                     {<br>                         series3.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Visibility_Low));<br>​<br>                     }<br>                     chartControl2.Series.Add(series3);<br>                     break;<br>                 case "最高可见度(km)":<br>                     Series series4 = new Series("最高可见度(km)", ViewType.Line);<br>                     foreach (var dataPoint in list)<br>                     {<br>                         series4.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Visibility_High));<br>​<br>                     }<br>                     chartControl2.Series.Add(series4);<br>                     break;<br>             }<br>​<br>​<br>         }<br>         // 绘图完成提示<br>         MessageBox.Show("绘图已完成");<br>​<br>     }<br>     else<br>     {<br>         MessageBox.Show("请检查开始日期、结束日期、站名和绘图指标是否都已填写!!!");<br>     }<br>​<br>​<br>​<br> }数据查询:
var list = db.Queryable<WeatherData>().Where(x => x.Date >= startDate && x.Date < endDate.AddDays(1) && x.StationName == name).ToList();
这里获取时间范围内的数据不用var list = db.Queryable().Where(x => x.Date >= startDate && x.Date
页: [1]
查看完整版本: 在winform中绘图