0

내 프로그램에 도움이 필요합니다. 사용자 정의 DayView control으로 VB.NET 프로그램을 실행할 때이 오류가 발생합니다."개체 참조가 개체의 인스턴스로 설정되지 않았습니다"목록에 추가 중

는 ************** 예외 텍스트는 ************** System.NullReferenceException : 개체 참조가의 인스턴스로 설정되지 않았습니다 목적. C : \ Users \ Daniel \ My Programs \ Visual Basic \ SeaCow \ SeaCow \ SeaCow \ Main.vb : 0120에서까지 Calendar.DayView.OnResolveAppointments (ResolveAppointmentsEventArgs args)의 에서 SeaCow.Main.DayView1_ResolveAppointments (Object sender, ResolveAppointmentsEventArgs args)) 시스템에서 System.Windows.Forms.Control.WmPaint에서 System.Windows.Forms.Control.PaintWithErrorHandling (있는 PaintEventArgs 즉 INT16 층)에서 Calendar.DayView.OnPaint (있는 PaintEventArgs E) (메시지 & m) 에서 . System.Windows.Forms.NativeWindow.Callback에서 Windows.Forms.Control.WndProc (메시지 & m) (HWND를 IntPtr, INT32의 MSG,을 IntPtr의 WPARAM, LPARAM을 IntPtr의)

,

오류 코드에 따르면 아래의 'for each'루프가 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 및 DayView.cs 제어 파일 ResolveAppointment 함수이다.

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 '의 거의 모든 경우가 같습니다. 일부 힌트는 "[.NET의 NullReferenceException은 무엇입니까?] (http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net)"를 참조하십시오. –

답변

1

DayView1_ResolveAppointments은 분명히 DayView1 컨트롤의 ResolveAppointments 이벤트에 대한 이벤트 처리기입니다. For Each이 예외를 던지면 그때는 appointmentsNothing이고 빈 목록이 아니라는 것을 의미합니다. 추가

If appointments Is Nothing Then 
    Return 
End If 

For Each 루프 이전에 추가하십시오.

0

Calendar.DayView 컨트롤이 OnResolveAppointments 함수를 오버라이드 OnPaint 내에서 호출하는 것으로 보입니다. 나는 그곳에서 코드를 검사 할 것을 제안한다.

한편 appointmentsNothing 인 경우 For Each을 건너 뛸 수 있습니다.