0

Мне нужна помощь с моей программой. Я получаю эту ошибку, когда запускаю свою программу VB.NET с помощью настраиваемого DayView control.«Ссылка на объект не установлена ​​в экземпляр объекта» При добавлении в список

************** Текст исключения ************** System.NullReferenceException: Ссылка на объект не указывает на экземпляр объект. at SeaCow.Main.DayView1_ResolveAppointments (Object sender, ResolveAppointmentsEventArgs args) в C: \ Users \ Daniel \ Мои программы \ Visual Basic \ SeaCow \ SeaCow \ SeaCow \ Main.vb: строка 120 в Calendar.DayView.OnResolveAppointments (ResolveAppointmentsEventArgs args) в Calendar.DayView.OnPaint (PaintEventArgs е) в System.Windows.Forms.Control.PaintWithErrorHandling (PaintEventArgs е, Int16 слой) в System.Windows.Forms.Control.WmPaint (Message & м) в системе. Windows.Forms.Control.WndProc (Сообщение & м) на System.Windows.Forms.NativeWindow.Callback (IntPtr HWND, Int32 тзд, IntPtr WPARAM, IntPtr LPARAM)

В соответствии с кодом ошибки цикл «для каждого» ниже вызывает ошибку NullReferenceException. По умолчанию список «назначений» ничем не назначен, и я не могу найти, где вызывается функция ResolveAppointments.

Private Sub DayView1_ResolveAppointments(ByVal sender As Object, ByVal args As Calendar.ResolveAppointmentsEventArgs) Handles DayView1.ResolveAppointments 
    Dim m_Apps As New List(Of Calendar.Appointment) 

    For Each m_App As Calendar.Appointment In appointments 
     If (m_App.StartDate >= args.StartDate) AndAlso (m_App.StartDate <= args.EndDate) Then 
      m_Apps.Add(m_App) 
     End If 
    Next 

    args.Appointments = m_Apps 
End Sub 

Вот это OnResolveAppointments и ResolveAppointment функции из файла управления DayView.cs.

public event EventHandler<ResolveAppointmentsEventArgs> OnResolveAppointments; 



protected virtual void ResolveAppointments(ResolveAppointmentsEventArgs args) 
    { 
     System.Diagnostics.Debug.WriteLine("Resolve app"); 

     if (OnResolveAppointments != null) 
      OnResolveAppointments(this, args); 

     this.allDayEventsHeaderHeight = 0; 

     // cache resolved appointments in hashtable by days. 
     cachedAppointments.Clear(); 

     if ((selectedAppointmentIsNew) && (selectedAppointment != null)) 
     { 
      if ((selectedAppointment.StartDate > args.StartDate) && (selectedAppointment.StartDate < args.EndDate)) 
      { 
       args.Appointments.Add(selectedAppointment); 
      } 
     } 

     foreach (Appointment appointment in args.Appointments) 
     { 
      int key = -1; 
      AppointmentList list; 

      if (appointment.StartDate.Day == appointment.EndDate.Day && appointment.AllDayEvent == false) 
      { 
       key = appointment.StartDate.Day; 
      } 
      else 
      { 
       key = -1; 
      } 

      list = (AppointmentList)cachedAppointments[key]; 

      if (list == null) 
      { 
       list = new AppointmentList(); 
       cachedAppointments[key] = list; 
      } 

      list.Add(appointment); 
     } 
    } 

Кроме того, здесь OnPaint метод

protected override void OnPaint(PaintEventArgs e) 
    { 
     e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 

     // resolve appointments on visible date range. 
     ResolveAppointmentsEventArgs args = new ResolveAppointmentsEventArgs(this.StartDate, this.StartDate.AddDays(daysToShow)); 
     ResolveAppointments(args); 

     using (SolidBrush backBrush = new SolidBrush(renderer.BackColor)) 
      e.Graphics.FillRectangle(backBrush, this.ClientRectangle); 

     // Visible Rectangle 
     Rectangle rectangle = new Rectangle(0, 0, this.Width - VScrollBarWith, this.Height); 

     DrawDays(ref e, rectangle); 

     DrawHourLabels(ref e, rectangle); 

     DrawDayHeaders(ref e, rectangle); 
    } 

Кто-нибудь есть какие-либо предложения?

+0

Что такое переменные с именами, начинающимися с 'm_'? Для меня это соглашение, обычно используемое для указания полей-членов (а не локальных переменных); это выглядит так странно для меня! –

+0

Почти все случаи «NullReferenceException» одинаковы. См. «[Что такое исключение NullReferenceException в .NET?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net)» для некоторых советов. –

ответ

1

DayView1_ResolveAppointments, очевидно, является обработчиком событий для события ResolveAppointments управления DayView1. Если For Each выбрасывает исключение, то это означает, что appointments в это время Nothing, а не пустой список, как вы ожидаете. Add

If appointments Is Nothing Then 
    Return 
End If 

до For Each петля.

0

Похоже, что ваше управление Calendar.DayView вызывает функцию OnResolveAppointments в пределах ее переопределения OnPaint. Я бы предложил вам изучить код там.

А пока вы могли бы просто пропустить For Each, если appointments is Nothing.