Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ошибка Nullable object must have a value

29K
18 марта 2010 года
Daniel Lavrushin
30 / / 26.10.2008
Здравствуйте,

использую WPF+ .NET3.5+WPF Toolkit Charts

Пытаюсь программно добавить точки на график LinesChart, получаю ошибку
Nullable object must have a value

Вот код заполнения точек на графике (они берутся из DataSet)
Код:
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())
                    });

                }



Класс 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() { }
   
    }


Скажу, что ошибку вызывает именно цикл и присвоение
Label = dr[labelid].ToString()
Скажем, если поставить Label = "2010" и запустить в цикле, то все работает как надо (ну за исключением, что график ставит точки по одной оси, но ставит же...). Также не могу понять, откуда он берет нулевое значение, все данные не равны нулю.

Я понимаю, что проблема какая-то пустяковая, но не могу понять, что ее вызывает.


Сильно не ругайте, WPF только начинаю осваивать. Помогите, пожалуйста.
5
18 марта 2010 года
hardcase
4.5K / / 09.08.2005
Что такое labelid?
29K
18 марта 2010 года
Daniel Lavrushin
30 / / 26.10.2008
Цитата: 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())
                }
    );


тоже не работает если сделать такой перебор
Код:
string[] labels = new string[] { "label1", "label2", "label3" };

            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())
                }
    );
5
18 марта 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Daniel Lavrushin

 
Код:
points.Add(new VelChartPoint
                {
                    Name = "LabelText",
                    Value = double.Parse(dc.Tables[0].Rows[0][1].ToString())
                }
    );


 
Код:
points.Add(new VelChartPoint
                {
                    Name = "LabelText",
                    Value = dr.Field<double>(labelid)
                }
    );
29K
18 марта 2010 года
Daniel Lavrushin
30 / / 26.10.2008
Цитата: hardcase



да, я понимаю, что там преобразование глупое, но речь в данном случае не об этом примере (он то как раз работает).

Вопрос, почему возникает ошибка-то в примере с циклом?

Код:
string[] labels = new string[] { "label1", "label2", "label3" };

            foreach (string label in labels)
            {
                points.Add(new VelChartPoint
                {
                    Name = label,
                    Value = 500.0
                }
                );

            }
29K
19 марта 2010 года
Daniel Lavrushin
30 / / 26.10.2008
Вот что еще нашел.
Такой пример успешно создает точки на графике
Код:
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.");
                 }

т. е. если убрать 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)));
             });
        }
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог