2013-07-10 4 views
2

Итак, я использую элемент управления Chart в .NET, который использует внутренний алгоритм автомасштабирования для оси Y. Все это отлично работает, но теперь я пытаюсь получить максимальное отображаемое значение Y-оси для хранения как двойное, чтобы использовать для дальнейшего форматирования.Как получить максимальное значение оси Y из управления диаграммой автомасштабирования

К сожалению, использование ChartControl.ChartAreas [0] .AxisY.Maximum возвращает двойной NaN, потому что я использую автомасштабирование.

Возможно ли получить максимальное отображаемое значение оси Y при использовании оси автомасштабирования?

РЕДАКТИРОВАНИЕ порядка, в котором я выступаю операции заключается в создание базового форматирования для гистограммы, добавляя точки данных с помощью AddXY(), а затем, наконец, пытаюсь получить максимальное значение отображаемой оси Y. Использование ChartControl.ChartAreas [0] .AxisY.Maximum по-прежнему возвращает NaN даже после добавления многочисленных данных.

+0

Я пробовал это с автомасштабированием. Если я не добавляю никаких точек данных, я получаю NaN, но если у меня есть какие-то точки данных в моей серии, я получаю правильное значение. Не могли бы вы добавить дополнительные сведения о том, как вы настраиваете свой контроль? –

+0

Обновлено с дополнительной информацией о моем управлении диаграммой. Ваш метод все еще возвращает NaN для меня. – SRTie4k

ответ

3

Он не вычисляет максимальное значение до тех пор, пока не появится график, поэтому следующий код выводит NaN:

public Form1() 
{ 
    InitializeComponent(); 
    this.chart1.Series.Clear(); 
    this.chart1.Series.Add("My Data"); 
    this.chart1.Series[0].Points.AddXY(1, 1); 
    this.chart1.Series[0].Points.AddXY(2, 2); 
    this.chart1.Series[0].Points.AddXY(3, 6); 
    MessageBox.Show(this.chart1.ChartAreas[0].AxisY.Maximum.ToString()); // returns NaN 
} 

Но проверка после того, как карта отображается даст правильное значение:

public Form1() 
{ 
    InitializeComponent(); 
    this.chart1.Series.Clear(); 
    this.chart1.Series.Add("My Data"); 
    this.chart1.Series[0].Points.AddXY(1, 1); 
    this.chart1.Series[0].Points.AddXY(2, 2); 
    this.chart1.Series[0].Points.AddXY(3, 6); 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show(this.chart1.ChartAreas[0].AxisY.Maximum.ToString()); // returns 8 
} 

В качестве альтернативы вы можете выполнить обновление сразу после того, как вы установили свои данные (но это не будет работать в конструкторе формы, потому что диаграмма еще не отображается):

private void button1_Click(object sender, EventArgs e) 
{ 
    this.chart1.Series.Clear(); 
    this.chart1.Series.Add("My Data"); 
    this.chart1.Series[0].Points.AddXY(1, 1); 
    this.chart1.Series[0].Points.AddXY(2, 2); 
    this.chart1.Series[0].Points.AddXY(3, 6); 
    this.chart1.Update(); 
    MessageBox.Show(this.chart1.ChartAreas[0].AxisY.Maximum.ToString()); // returns 8 
} 

Вот еще один способ сделать это с помощью события OnShown формы и два ряда данных:

public Form1() 
{ 
    InitializeComponent(); 
    this.chart1.Series.Clear(); 
    this.chart1.Series.Add("My Data"); 
    this.chart1.Series[0].Points.AddXY(1, 1); 
    this.chart1.Series[0].Points.AddXY(2, 2); 
    this.chart1.Series[0].Points.AddXY(3, 6); 
    this.chart1.Series.Add("My Data2"); 
    this.chart1.Series[1].Points.AddXY(1, 1); 
    this.chart1.Series[1].Points.AddXY(2, 9); 
} 

protected override void OnShown(EventArgs e) 
{ 
    base.OnShown(e); 
    this.chart1.Update(); 
    MessageBox.Show(this.chart1.ChartAreas[0].AxisY.Maximum.ToString()); // returns 10 
} 
+0

Что такое 'n' серии? – Brad

+0

Он возвращает максимум, рассчитанный для Y среди всех серий. –

+0

OP действительно не дал понять, что, возможно, это не имеет значения, но сейчас это вернет максимум только серии [0]. – Brad

5

вызова chart.ChartAreas[0].RecalculateAxesScale();

Тогда chart1.ChartAreas[0].AxisY.Maximum и Minimum будет установлен правильно.

+0

Это должен быть принятый ответ! – TaW

1

Мне нужно было установить их перед вызовом RecalculateAxesScale, потому что я установил их при отображении другого набора данных в том же элементе управления диаграммы.

chart.ChartAreas[0].AxisY.ScaleView.Size = double.NaN; 
    chart.ChartAreas[0].AxisY2.ScaleView.Size = double.NaN; 

EDIT: Для того, чтобы уточнить, я был повторно использовать один и тот же элемент управления диаграммой для отображения графики различных наборов данных в зависимости от выбора пользователя. Один из параметров устанавливает ScaleView.Size в значение, отличное от значения по умолчанию (NaN). Поэтому мне нужно было установить его по умолчанию, чтобы позволить RecalculateAxesScale работать так, как должно.

Смежные вопросы