使用参数隐藏轴

时间:2013-06-18 15:49:04

标签: c# devexpress

我有一个报告,它使用参数在运行时隐藏或显示图表上的数据。我有以下代码来读取参数并使用它来控制轴的可见性。

        ((SplineSeriesView)xrChart1.Series[0].View).AxisY.Visible = Convert.ToBoolean(this.Parameters[0].Value);
        ((SplineSeriesView)xrChart1.Series[1].View).AxisY.Visible = Convert.ToBoolean(this.Parameters[1].Value);
        ((SplineSeriesView)xrChart1.Series[2].View).AxisY.Visible = Convert.ToBoolean(this.Parameters[2].Value);
        ((SplineSeriesView)xrChart1.Series[3].View).AxisY.Visible = Convert.ToBoolean(this.Parameters[3].Value);
        ((SplineSeriesView)xrChart1.Series[4].View).AxisY.Visible = Convert.ToBoolean(this.Parameters[4].Value);
        ((SplineSeriesView)xrChart1.Series[5].View).AxisY.Visible = Convert.ToBoolean(this.Parameters[5].Value); 

因为系列0和系列1都绑定到同一个轴,所以我使用的是或运算符。我遇到的问题是当它们都是假的时候轴不会隐藏。这是我正在使用的代码:

        bool zero = Convert.ToBoolean(this.Parameters[0].Value);
        bool one = Convert.ToBoolean(this.Parameters[1].Value);

        if ((zero = true)||(one = true))
        {
            ((SplineSeriesView)xrChart1.Series[0].View).AxisY.Visible = true;

        }

        else if ((zero = false) && (one = false))
        {
            ((SplineSeriesView)xrChart1.Series[0].View).AxisY.Visible = false;
        }

如何让轴隐藏?提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我认为您的问题是使用'='而不是'=='。表达式zero = true将{0}设置为true,此true值用作表达式值。因此,在第一个条件检查'零'后总是变为真,'else'分支永远不会执行,因为'零'不再是假的。

事实上,表达式zero == true仅等于zero,因此您可以简化条件:

    bool zero = Convert.ToBoolean(this.Parameters[0].Value);
    bool one = Convert.ToBoolean(this.Parameters[1].Value);

    if (zero || one) // true if 'zero' or 'one' is true
    {
        ((SplineSeriesView)xrChart1.Series[0].View).AxisY.Visible = true;
    }
    else // goes here if both 'zero' and 'one' is false
    {
        ((SplineSeriesView)xrChart1.Series[0].View).AxisY.Visible = false;
    }

甚至

    bool zero = Convert.ToBoolean(this.Parameters[0].Value);
    bool one = Convert.ToBoolean(this.Parameters[1].Value);
    bool axisVisible = zero || one;

    ((SplineSeriesView)xrChart1.Series[0].View).AxisY.Visible = axisVisible;

答案 1 :(得分:1)

重要的是要记住相等比较==和settor运算符=之间的区别。在if语句中,您正在使用settor,并希望使用比较。

如果您使用正确的运算符,您的代码可能如下所示,这应该可以解决您的问题:

    if ((zero == true)||(one == true))
    {
        ((SplineSeriesView)xrChart1.Series[0].View).AxisY.Visible = true;

    }
    else if ((zero == false) && (one == false))
    {
        ((SplineSeriesView)xrChart1.Series[0].View).AxisY.Visible = false;
    }

您遇到问题的原因是您使用的是settor,它自动将零和一设置为true。因此,该程序将您的if语句评估为:“if(true或true)”,这始终是真的。这就是将值设置为false的原因无效。

顺便说一下,你可以采取一些措施来避免这种错误。首先,您的编译器应该警告您没有使用相等运算符。其次,您可以养成将常量放在第一位的习惯:if (false = zero)会产生编译时错误。 (就个人而言,我真的不喜欢那种编码风格,它不会干净利落地读给我,但你的里程可能会有所不同。)

我会将你的陈述重写为更清晰,但功能相同:

if (zero || one)
{
    ((SplineSeriesView)xrChart1.Series[0].View).AxisY.Visible = true;
}
else
{
    ((SplineSeriesView)xrChart1.Series[0].View).AxisY.Visible = false;
}

当你将布尔变量放入if语句时,没有充分的理由将它们与布尔常量进行比较。你的第二个if根本不是必需的,因为如果第一个没有,那么它是唯一可能发生的情况。 (即“if!(zero || one)”===“!zero&&!one” - 它被称为DeMorgan的规则。)

事实上,你的整个if语句可以简化为一个明确的界限:

    ((SplineSeriesView)xrChart1.Series[0].View).AxisY.Visible = zero || one;