2014-09-09 3 views
1

У меня есть проблема построения графика с помощью ZedGraphControl в конструкторе моего WinForm инициализирует график так:ZedGraph объекта nullreference Исключение

ZedGraphControl Graph = new ZedGraphControl(); 
Graph.Dock = DockStyle.Fill; 
GroupBoxGraph.Controls.Add(Graph); 

GraphPane pane = Graph.GraphPane; 

/*Initial pane settings*/ 
pane.XAxis.Type = AxisType.Date; 
pane.XAxis.Scale.Format = "HH:mm:ss"; 
pane.XAxis.Scale.Min = (XDate)(DateTime.Now); 
//Shows 30 seconds interval. 
pane.XAxis.Scale.Max = (XDate)(DateTime.Now.AddSeconds(30)); 
pane.XAxis.Scale.MinorUnit = DateUnit.Second; 
pane.XAxis.Scale.MajorUnit = DateUnit.Minute; 
pane.XAxis.MajorTic.IsBetweenLabels = true; 
pane.XAxis.MinorTic.Size = 5;   

RollingPointPairList list = new RollingPointPairList(1200); 
LineItem curve = pane.AddCurve("Hmi Mode", list, Color.Blue, SymbolType.None); 

Graph.AxisChange(); 
tickStart = Environment.TickCount; 

и просто для испытания я хочу построить новую точку, когда я нажмите кнопку. Таким образом, нажатие кнопки на кнопке Я хочу выполнить этот код:

private void button1_Click(object sender, EventArgs e) 
    { 
     if (Graph != null) { 
      // Make sure that the curvelist has at least one curve 
      if (Graph.GraphPane.CurveList.Count <= 0) 
       return; 

      // Get the first CurveItem in the graph 
      LineItem curve = Graph.GraphPane.CurveList[0] as LineItem; 
      if (curve == null) 
       return; 

      // Get the PointPairList 
      IPointListEdit list = curve.Points as IPointListEdit; 
      // If this is null, it means the reference at curve.Points does not 
      // support IPointListEdit, so we won't be able to modify it 
      if (list == null) 
       return; 

      // Time is measured in seconds 
      double time = (Environment.TickCount - tickStart)/1000.0; 

      // 3 seconds per cycle 
      list.Add(time, Math.Sin(2.0 * Math.PI * time/3.0)); 

      // Keep the X scale at a rolling 30 second interval, with one 
      // major step between the max X value and the end of the axis 
      Scale xScale = Graph.GraphPane.XAxis.Scale; 
      if (time > xScale.Max - xScale.MajorStep) { 
       xScale.Max = time + xScale.MajorStep; 
       xScale.Min = xScale.Max - 30.0; 
      } 

      // Make sure the Y axis is rescaled to accommodate actual data 
      Graph.AxisChange(); 
      // Force a redraw 
      Graph.Invalidate(); 
     } 
    } 

Но мой объект Graph всегда имеет значение null! Я даже создал свойство и поставил точку останова в сеттер. Сеттер никогда не вызывается, но объект по-прежнему равен нулю. (После первой строки кода я отправил Graph объект не является нулевым.

Любая идея, как это может произойти? Спасибо

+0

Ваш первый блок кода выглядит как это создает _local variable_ под названием 'Graph', но ваш второй блок кода' button1_Click' выглядит, как он пытается использовать _class field_ (или _property_), называемый 'Graph'. Это два разных объекта. Попробуйте изменить свой первый код, чтобы удалить объявление локальной переменной и вместо этого ссылаться на поле (т. Е. Изменить первую строку на: 'Graph = new ZedGraphControl();'). Если вы уверены, что это не так, пожалуйста, отправьте код _actual_, который вы используете. –

ответ

0

Ваш первый блок кода выглядит он создает локальную переменную под названием Graph, но ваш второй блок кода button1_Click выглядит, как он пытается использовать поле в класса (или свойство) под названием Graph. это две разные сущности. Таким образом, скорее всего, ваш инициализирует код никогда не назначая экземпляр ZedGraphControl в поле Graph, таким образом, это всегда null.

Попробуйте изменить первый код, чтобы удалить локальное объявление переменной и вместо этого ссылаться на это поле. То есть, изменить первую строку на:

Graph = new ZedGraphControl(); 
Смежные вопросы