C#图表中的Dynamic Enabled = true

时间:2016-11-03 10:46:00

标签: c# visual-studio charts

我有一个包含不同曲目值的数据库。

例如:

第1道:

Sensor 1
Sensor 2
Sensor 3
Sensor 4
Sensor 5
Sensor 6
Sensor 7
Sensor 8

第2道:

Sensor 1 
Sensor 2 
Sensor 3 
Sensor 4 
Sensor 5 
Sensor 6 
Sensor 7 
Sensor 8 
Sensor 9 
Sensor 10 
Sensor 11 
Sensor 12

正如您所见,Track 2有12个传感器(Witch是最大的!)。

现在我想在图表中显示传感器的值。女巫正在工作。

但是现在有12项硬编码。因此,当有8个传感器时,图例仍将显示12。

现在我做的是添加Enabled = False,所以你不会看到它。 (见下面的例子)

<chart:DataSeries x:Name="dsSensor1" Enabled="False" RenderAs="Line" LineThickness="3" LegendText="1" XValueType="DateTime" XValueFormatString="dd-MM HH:mm" YValueFormatString="#0.##'V'" MarkerEnabled="False">
    <chart:DataSeries.DataPoints>
        <chart:DataPoint XValue="2001-01-01" YValue="3.2" Enabled="False"/>
    </chart:DataSeries.DataPoints>
</chart:DataSeries>
<chart:DataSeries x:Name="dsSensor2" Enabled="False" RenderAs="Line" LineThickness="3" LegendText="2" XValueType="DateTime" XValueFormatString="dd-MM HH:mm" YValueFormatString="#0.##'V'"  MarkerEnabled="False">
    <chart:DataSeries.DataPoints>
        <chart:DataPoint XValue="2001-01-01" YValue="3.2" Enabled="False"/>
    </chart:DataSeries.DataPoints>
</chart:DataSeries>

目前你还没有看到传奇。

现在我的代码我做了一个像这样的新循环:

foreach (DCHistory item in loadOperation.Entities.OrderByDescending(t => t.SensorNumber).Take(1))

这将占用特定曲目的最高数量。例如,此查询将导致 8

我现在做的是=

    foreach (DCHistory item in loadOperation.Entities.OrderByDescending(t => t.SensorNumber).Take(1))
    {
        DataSeries series1 = chart.Series.First(s => s.Name == string.Format("dsSensor1"));
        DataSeries series2 = chart.Series.First(s => s.Name == string.Format("dsSensor2"));
        DataSeries series3 = chart.Series.First(s => s.Name == string.Format("dsSensor3"));
        DataSeries series4 = chart.Series.First(s => s.Name == string.Format("dsSensor4"));
        DataSeries series5 = chart.Series.First(s => s.Name == string.Format("dsSensor5"));
        DataSeries series6 = chart.Series.First(s => s.Name == string.Format("dsSensor6"));
        DataSeries series7 = chart.Series.First(s => s.Name == string.Format("dsSensor7"));
        DataSeries series8 = chart.Series.First(s => s.Name == string.Format("dsSensor8"));
        DataSeries series9 = chart.Series.First(s => s.Name == string.Format("dsSensor9"));
        DataSeries series10 = chart.Series.First(s => s.Name == string.Format("dsSensor10"));
        DataSeries series11 = chart.Series.First(s => s.Name == string.Format("dsSensor11"));
        DataSeries series12 = chart.Series.First(s => s.Name == string.Format("dsSensor12"));
        int sensor = item.SensorNumber;
        if (sensor == 8)
        {
            series1.Enabled = true;
            series2.Enabled = true;
            series3.Enabled = true;
            series4.Enabled = true;
            series5.Enabled = true;
            series6.Enabled = true;
            series7.Enabled = true;
            series8.Enabled = true;
        }
    }

如果结果为8,则此代码将计数。如果为8,则启用图例中的前8项。

现在这个有用了。但是我还需要为12个传感器制作一个,或6个。 这将产生大量代码,但仍然是硬编码

  

我的问题:

是否可以在for循环中进行此操作?

我已经尝试过但是没有成功......

我尝试了什么:

foreach (DCHistory item in loadOperation.Entities.OrderByDescending(t => t.SensorNumber).Take(1))
            {
                int sensor = item.SensorNumber;
                int sensor2 = sensor + 1; //set +1 because if number = 0, it gives error.
                if (sensor >= 1)
                {
                    for (int number = 1; number < sensor2; number++)
                    {
                        DataSeries series = chart.Series.First(s => s.Name == string.Format("dsSensor{0}", number));
                        series.Enabled = true;
                    }
                }
            }

这段代码的结果是,即使有8个......

,图例也会显示12个传感器

2 个答案:

答案 0 :(得分:0)

当然,我会将您的代码转换为使用某些Linq代替。

var series = Enumerable.Range(1, item.SensorNumber)
    .Select(i => chart.Series.First(s => s.Name == ("dsSensor" + i)))
    .ToArray();

for(var i = 0; i < series.Length; ++i){
    series[i].Enabled = true;
}

答案 1 :(得分:0)

好吧,我有一个太棒了!

我认为,一旦我访问了一个带有12个传感器的轨道,它就会将传感器保持为Enabled = true。

因此,每当我访问一个带有8个传感器的轨道时,旧的传感器都会保持启用状态。

我现在做了什么:

        foreach (DCHistory item in loadOperation.Entities.OrderByDescending(t => t.SensorNumber).Take(1))//Gets highest sensor number of the track
        {
            var sensor = item.SensorNumber + 1;//Gets the number we just asked from the loop. For example 8 or 12.
            var start = 1;
            var max = 12;

            while (start < sensor)
            {
                var test = chart.Series.First(s => s.Name == string.Format("dsSensor{0}", start.ToString()));
                test.Enabled = true;
                start++;
            }
            if (sensor < max)
            {
                while (sensor <= max)
                {
                    var test2 = chart.Series.First(s => s.Name == string.Format("dsSensor{0}", sensor.ToString()));
                    test2.Enabled = false;
                    sensor++;
                }
            }
        }

基本上,我检查了传感器数量是否为8。它会检查它是否低于最大值。如果它较低,则禁用其余部分。