2016-06-16 4 views
1

Я хочу создать диаграмму, чтобы пользователь мог автомасштабировать ось y, а также иметь возможность вручную изменять ось во время выполнения. Я могу автомасштабировать до тех пор, пока ось y не будет изменена с помощью updowns, однако, как только я сменил любое значение вниз, автомасштаба не реагирует.Переключатель оси Y Y между автоматическим и ручным диапазоном

private void numUD_Graph_Ymax_ValueChanged(object sender, EventArgs e) 
    { 
     try 
     { 
      int newmax = (int)numUD_Graph_Ymax.Value; 
      int allowedmin = (int)numUD_Graph_Ymax.Minimum; 
      int allowedmax = (int)numUD_Graph_Ymax.Maximum; 

      if (newmax >= allowedmin && newmax <= allowedmax && newmax > chart.ChartAreas[0].AxisY.Minimum) 
      { 
       chart.ChartAreas[0].AxisY.Maximum = newmax; 
       chart.Update(); 
      } 
     } 
     catch (Exception exception) 
     { 
      MessageBox.Show(exception.ToString()); 
     } 
    } 

    private void numUD_Graph_Ymin_ValueChanged(object sender, EventArgs e) 
    { 
     try 
     { 
      int newmin = (int)numUD_Graph_Ymin.Value; 
      int allowedmin = (int)numUD_Graph_Ymin.Minimum; 
      int allowedmax = (int)numUD_Graph_Ymin.Maximum; 

      if (newmin >= allowedmin && newmin <= allowedmax && newmin < chart.ChartAreas[0].AxisY.Maximum) 
      { 
       chart.ChartAreas[0].AxisY.Minimum = newmin; 
       chart.Update(); 
      } 
     } 
     catch (Exception exception) 
     { 
      MessageBox.Show(exception.ToString()); 
     } 
    } 

И это моя кнопка обработчик для автомасштабирования видимых данные:

 private void btn_AutoSize_Click(object sender, EventArgs e) 
    { 
     chart.ChartAreas[0].RecalculateAxesScale(); 
     chart.Update(); 
     updateUI(); 

    } 
private void updateUI() 
    { 
      numUD_Graph_Xmin.Value = (decimal)chart.ChartAreas[0].AxisX.Minimum; 
      numUD_Graph_Xmax.Value = (decimal)chart.ChartAreas[0].AxisX.Maximum; 
      numUD_Graph_XInterval.Value = (decimal)chart.ChartAreas[0].AxisX.Interval; 
      numUD_Graph_Ymin.Value = (decimal)chart.ChartAreas[0].AxisY.Minimum; 
      numUD_Graph_Ymax.Value = (decimal)chart.ChartAreas[0].AxisY.Maximum; 

    } 

Где я буду неправильно? Как автомасштабировать и загружать новые координаты в числовые аппроксимации, а также позволять пользователю дополнительно модифицировать график, используя верхние вниз.

ответ

1

Ключа к возвращая автоматическое масштабирование после того, как установить один из Minimum и/или Maximum значений Axis «ы состоит в сброс (все) эти значений:

private void btn_AutoSize_Click(object sender, EventArgs e) 
{ 
    chart.ChartAreas[0].AxisX.Minimum = double.NaN; /// <-- this is the magic 'number' 
    chart.ChartAreas[0].AxisX.Maximum = double.NaN; 
    chart.ChartAreas[0].AxisY.Minimum = double.NaN; 
    chart.ChartAreas[0].AxisY.Maximum = double.NaN; 


// not quite sure about these lines 
/* 
    chart.ChartAreas[0].RecalculateAxesScale(); 
    chart.Update(); 
    updateUI(); 

*/ 

} 

Примечание:

  • RecalculateAxesScale не должен быть необходим, поскольку вы не закодировали событие Customize.

  • updateUI(); действительно сложно установить эти NumericUpDowns в полезные значения, так как они принимают только числа и не знают состояние «unset», кроме того, что отключены.

Я бы уронить кнопку для CheckBox cbx_AutoRange {Text = "Automatic Range"} и фактически отключить numUD, когда он переходит в Checked. После отключив его я бы установить значения тока мин/макс значений в Series может быть, как это:

private void cbx_AutoRange_CheckedChanged(object sender, EventArgs e) 
{ 
    if (cbx_AutoRange.Checked) 
    { 
     chart.ChartAreas[0].AxisX.Minimum = double.NaN; 
     chart.ChartAreas[0].AxisX.Maximum = double.NaN; 
     chart.ChartAreas[0].AxisX.Interval = double.NaN; 
     chart.ChartAreas[0].AxisY.Minimum = double.NaN; 
     chart.ChartAreas[0].AxisY.Maximum = double.NaN; 

     numUD_Graph_Xmin.Enabled = false; 
     numUD_Graph_Xmax.Enabled = false; 
     numUD_Graph_XInterval.Enabled = false; 
     numUD_Graph_Ymin.Enabled = false; 
     numUD_Graph_Ymax.Enabled = false; 

    } 
    else 
    { 
     numUD_Graph_Xmin.Enabled = true; 
     numUD_Graph_Xmin.Value = (decimal)chart1.Series[0].Points.FindMinByValue().XValue; 
     numUD_Graph_Xmax.Value = (decimal)chart1.Series[0].Points.FindMaxByValue().XValue; 
     //.. etc 
     //.. etc 

    } 

} 

Не знаю, почему у вас есть код для обеих осей, если вы хотите, чтобы включить автомасштабирование для только один?