ObservableCollection<VelChartPoint> points = new ObservableCollection<VelChartPoint>();
foreach (DataRow dr in dc.Tables[0].Rows)
{
points.Add(new VelChartPoint()
{
Label = dr[labelid].ToString(),
Value = double.Parse(dr[valueid].ToString())
});
}
Ошибка Nullable object must have a value
использую WPF+ .NET3.5+WPF Toolkit Charts
Пытаюсь программно добавить точки на график LinesChart, получаю ошибку
Nullable object must have a value
Вот код заполнения точек на графике (они берутся из DataSet)
Код:
Класс VelChartPoint
Код:
public class VelChartPoint : VelObject, INotifyPropertyChanged {
public DateTime Date
{
get;
set;
}
public string Label
{
get;
set;
}
private double _Value;
public double Value
{
get {
return _Value;
}
set {
_Value = value;
var handler = PropertyChanged;
if (null != handler)
{
handler.Invoke(this, new PropertyChangedEventArgs("Value"));
}
}
}
public string FieldName
{
get;
set;
}
public event PropertyChangedEventHandler PropertyChanged;
public VelChartPoint() { }
}
public DateTime Date
{
get;
set;
}
public string Label
{
get;
set;
}
private double _Value;
public double Value
{
get {
return _Value;
}
set {
_Value = value;
var handler = PropertyChanged;
if (null != handler)
{
handler.Invoke(this, new PropertyChangedEventArgs("Value"));
}
}
}
public string FieldName
{
get;
set;
}
public event PropertyChangedEventHandler PropertyChanged;
public VelChartPoint() { }
}
Скажу, что ошибку вызывает именно цикл и присвоение
Label = dr[labelid].ToString()
Скажем, если поставить Label = "2010" и запустить в цикле, то все работает как надо (ну за исключением, что график ставит точки по одной оси, но ставит же...). Также не могу понять, откуда он берет нулевое значение, все данные не равны нулю.
Я понимаю, что проблема какая-то пустяковая, но не могу понять, что ее вызывает.
Сильно не ругайте, WPF только начинаю осваивать. Помогите, пожалуйста.
Что такое labelid?
Цитата: hardcase
Что такое labelid?
labelid и valueid - это int колонок DataRow. Они верны, я уж перепроверил.
например это не работает, если даже без перебора (выдает ошибку выше)
Код:
points.Add(new VelChartPoint
{
Name = dc.Tables[0].Rows[0][0].ToString(),
Value = double.Parse(dc.Tables[0].Rows[0][1].ToString())
}
);
{
Name = dc.Tables[0].Rows[0][0].ToString(),
Value = double.Parse(dc.Tables[0].Rows[0][1].ToString())
}
);
тоже не работает если сделать такой перебор
Код:
string[] labels = new string[] { "label1", "label2", "label3" };
foreach (string label in labels)
{
points.Add(new VelChartPoint
{
Name = label,
Value = 500.0
}
);
}
foreach (string label in labels)
{
points.Add(new VelChartPoint
{
Name = label,
Value = 500.0
}
);
}
но работает
Код:
points.Add(new VelChartPoint
{
Name = "LabelText",
Value = double.Parse(dc.Tables[0].Rows[0][1].ToString())
}
);
{
Name = "LabelText",
Value = double.Parse(dc.Tables[0].Rows[0][1].ToString())
}
);
Цитата: Daniel Lavrushin
Код:
points.Add(new VelChartPoint
{
Name = "LabelText",
Value = double.Parse(dc.Tables[0].Rows[0][1].ToString())
}
);
{
Name = "LabelText",
Value = double.Parse(dc.Tables[0].Rows[0][1].ToString())
}
);
Код:
points.Add(new VelChartPoint
{
Name = "LabelText",
Value = dr.Field<double>(labelid)
}
);
{
Name = "LabelText",
Value = dr.Field<double>(labelid)
}
);
Цитата: hardcase
да, я понимаю, что там преобразование глупое, но речь в данном случае не об этом примере (он то как раз работает).
Вопрос, почему возникает ошибка-то в примере с циклом?
Код:
string[] labels = new string[] { "label1", "label2", "label3" };
foreach (string label in labels)
{
points.Add(new VelChartPoint
{
Name = label,
Value = 500.0
}
);
}
foreach (string label in labels)
{
points.Add(new VelChartPoint
{
Name = label,
Value = 500.0
}
);
}
Такой пример успешно создает точки на графике
Код:
foreach (DataRow dr in dc.Tables[0].Rows)
{
points.Add(new VelChartPoint
{
Name = dr.Field<string>(labelid),
Value = (dr.Field<int>(valueid) * 1.0)
});
MessageBox.Show("point added.");
}
{
points.Add(new VelChartPoint
{
Name = dr.Field<string>(labelid),
Value = (dr.Field<int>(valueid) * 1.0)
});
MessageBox.Show("point added.");
}
т. е. если убрать MessageBox, то возникает исключение.
из-за паузы что ли? Может он не успевает что-то сделать?
Вот полный код программы:
Код:
CompanyApi VelWb; //Веб служба на сервере, которая отдает Датасеты
public VelChartPoints points; // точки ObservableCollection<VelChartPoint>
DataSet dc; // датасет
public CompanyStatisticsWindow()
{
InitializeComponent();
points = this.Resources["VelChartPoints"] as VelChartPoints;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Thread thrloadcharts = new Thread(LoadCharts);
thrloadcharts.Start();
}
private void LoadCharts()
{
VelWb = new CompanyApi ();
VelWb.UseDefaultCredentials = true;
VelWb.Credentials = CredentialCache.DefaultNetworkCredentials;
VelWb.Url = VelGlobal.LoadedSettings.WebService;
dc = VelWb.Analytics_SalesProdGroupsbyCustomer("235000405", "235000405");
InsertDatatoLineChartFirstTab(chart1);
}
private void InsertDatatoLineChartFirstTab(Chart chart)
{
double maxvalue = 0.0;
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate
{
foreach (DataRow dr in dc.Tables[0].Rows)
{
points.Add(new VelChartPoint
{
Name = dr.Field<string>(0),
Value = (double)(dr.Field<int>(1))
});
maxvalue = Math.Max(maxvalue, (double)(dr.Field<int>(1)));
MessageBox.Show("point added.");
}
LinearAxis axis = chart.Axes[1] as LinearAxis;
axis.SetValue(LinearAxis.MaximumProperty, (maxvalue + (maxvalue / 4)));
});
}
public VelChartPoints points; // точки ObservableCollection<VelChartPoint>
DataSet dc; // датасет
public CompanyStatisticsWindow()
{
InitializeComponent();
points = this.Resources["VelChartPoints"] as VelChartPoints;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Thread thrloadcharts = new Thread(LoadCharts);
thrloadcharts.Start();
}
private void LoadCharts()
{
VelWb = new CompanyApi ();
VelWb.UseDefaultCredentials = true;
VelWb.Credentials = CredentialCache.DefaultNetworkCredentials;
VelWb.Url = VelGlobal.LoadedSettings.WebService;
dc = VelWb.Analytics_SalesProdGroupsbyCustomer("235000405", "235000405");
InsertDatatoLineChartFirstTab(chart1);
}
private void InsertDatatoLineChartFirstTab(Chart chart)
{
double maxvalue = 0.0;
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate
{
foreach (DataRow dr in dc.Tables[0].Rows)
{
points.Add(new VelChartPoint
{
Name = dr.Field<string>(0),
Value = (double)(dr.Field<int>(1))
});
maxvalue = Math.Max(maxvalue, (double)(dr.Field<int>(1)));
MessageBox.Show("point added.");
}
LinearAxis axis = chart.Axes[1] as LinearAxis;
axis.SetValue(LinearAxis.MaximumProperty, (maxvalue + (maxvalue / 4)));
});
}