У меня есть проблема построения графика с помощью 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
объект не является нулевым.
Любая идея, как это может произойти? Спасибо
Ваш первый блок кода выглядит как это создает _local variable_ под названием 'Graph', но ваш второй блок кода' button1_Click' выглядит, как он пытается использовать _class field_ (или _property_), называемый 'Graph'. Это два разных объекта. Попробуйте изменить свой первый код, чтобы удалить объявление локальной переменной и вместо этого ссылаться на поле (т. Е. Изменить первую строку на: 'Graph = new ZedGraphControl();'). Если вы уверены, что это не так, пожалуйста, отправьте код _actual_, который вы используете. –