使用变量访问图表

本文关键字:访问 变量 | 更新日期: 2023-09-27 17:58:54

我有一个C#WinForms应用程序,它有四个图表控件,用于以图形方式显示一些分析结果。

我有为每个图工作的代码,然而为了更高效&重用代码我定义了一个代码块:

  • 创建所需的系列
  • 从数据库中提取数据&将结果分配给相应的系列
  • 将系列添加到图表
  • 自定义图表外观

以上所有操作都是动态完成的,因为数据在设计时并不存在。

我希望重复使用的工作代码是:

// Add both series to the chart.  
ChartName.Series.AddRange(new Series[] { series1, series2 });  
// Cast the chart's diagram to the XYDiagram type, to access its axes.  
XYDiagram diagram = (XYDiagram)ChartName.Diagram; 

我想将ChartName对象更改为一个变量,我可以将该变量传递给每个图表,以便重用代码。类似(注意这不起作用):-

var VChart = this.Controls.Find(ChartName, true);  
// Add both series to the chart.  
VChart.Series.AddRange(new Series[] { series1, series2 });  
// Cast the chart's diagram to the XYDiagram type, to access its axes.  
XYDiagram diagram = (XYDiagram)VChart.Diagram; 

任何关于如何将变量传递到ChartName的想法、提示、提示等都将不胜感激。

完整代码:

    void Generate_Chart()
    {
        // Create two stacked bar series.
        Series series1 = new Series("Data", ViewType.Bar);
        Series series2 = new Series("Ben", ViewType.Line);
        try
        {                    
            using (var cmd = new SQLiteCommand(m_dbConnection))
            for (int i = LoopMin; i < LoopMax; i++)
            {
                // Retrieve the actual calculated values from the database
                cmd.CommandText = "SELECT " + Chart_SourceActualValue + " FROM " + Chart_SourceTable + " WHERE Value = " + i + "";
                Chart_SeriesA_Value = Convert.ToInt32(cmd.ExecuteScalar());
                // Retrieve the expected values from the database
                cmd.CommandText = "SELECT " + Chart_BenExpValue + " FROM " + Chart_SourceTable + " WHERE Value = " + i + "";
                Chart_SeriesB_Value = Convert.ToInt32(cmd.ExecuteScalar());
                // Add the dynamically created values to a series point for the chart
                series1.Points.Add(new SeriesPoint(i, Chart_SeriesA_Value));
                series2.Points.Add(new SeriesPoint(i, Chart_SeriesB_Value));
            }
        }
        catch (Exception)
        {                
            throw;
        }
        // Add both series to the chart.
        //this.Controls.Find(varChart, true)
        ChartName.Series.AddRange(new Series[] { series1, series2 });
        // Remove the GridLines from the chart for better UI
        // Cast the chart's diagram to the XYDiagram type, to access its axes.
        XYDiagram diagram = (XYDiagram)ChartName.Diagram;
        // Customize the appearance of the axes' grid lines.
        diagram.AxisX.GridLines.Visible = false;
        }        
}

使用变量访问图表

这听起来像是您要求用一个变量替换硬编码的ChartName,这样您就可以四次不同的调用例程,每次都使用不同的图表。我已经取了你的代码,替换了图表控制和设置的一些全局变量,并使它们成为你传递到函数中的参数:

void Generate_Chart(DevExpress.XtraCharts.ChartControl chartCtrl,
                   string chart_sourceActualValue,
                    string chart_sourceTable,
                   string chart_benExpValue
                   )
    {
        // Create two stacked bar series.
        Series series1 = new Series("Data", ViewType.Bar);
        Series series2 = new Series("Ben", ViewType.Line);
        try
        {                    
            using (var cmd = new SQLiteCommand(m_dbConnection))
            for (int i = LoopMin; i < LoopMax; i++)
            {
                // Retrieve the actual calculated values from the database
                cmd.CommandText = "SELECT " + sourceActualValue + " FROM " + 
                     chart_sourceTable + " WHERE Value = " + i + "";
                Chart_SeriesA_Value = Convert.ToInt32(cmd.ExecuteScalar());
                // Retrieve the expected values from the database
                cmd.CommandText = "SELECT " + chart_benExpValue + " FROM " + 
                         chart_sourceTable + " WHERE Value = " + i + "";
                Chart_SeriesB_Value = Convert.ToInt32(cmd.ExecuteScalar());
                // Add the dynamically created values 
                // to a series point for the chart
                series1.Points.Add(new SeriesPoint(i, Chart_SeriesA_Value));
                series2.Points.Add(new SeriesPoint(i, Chart_SeriesB_Value));
            }
        }
        catch (Exception)
        {                
            throw;
        }
        // Add both series to the chart.
        chartCtrl.Series.AddRange(new Series[] { series1, series2 });
        // Remove the GridLines from the chart for better UI
        // Cast the chart's diagram to the XYDiagram type, to access its axes.
        XYDiagram diagram = (XYDiagram)chartCtrl.Diagram;
        // Customize the appearance of the axes' grid lines.
        diagram.AxisX.GridLines.Visible = false;
        }        
}

然后,您最终使用原始值作为参数来调用此方法:

void Generate_Chart(ChartName, Chart_SourceActualValue, Chart_SourceTable, 
                    Chart_BenExpValue);
// call it three other times passing in the different specifics for that chart. e.g.
void Generate_Chart(SomeOtherChartName, SomeOtherChart_SourceActualValue, 
                    SomeOhterChart_SourceTable, SomeOtherChart_BenExpValue);
.....