"لم يتم ضبط مرجع الكائن على مثيل لكائن" أثناء الإضافة إلى قائمة
-
26-09-2019 - |
سؤال
أحتاج إلى بعض المساعدة في برنامجي. أحصل على هذا الخطأ عندما أقوم بتشغيل برنامج VB.NET Dayview Control.
************** نص استثناء **************** System.NullReferenceException: لم يتم تعيين مرجع كائن على مثيل لكائن. في seacow.main.dayview1_resolveappointments (مرسل الكائن ، ResolveAppointseventseventArgs) في C: Users Daniel My Programs Visual Basic SeaCow SeaCow SeaCow Main.vb: Line 120 at Clendar.DayView calendar.dayview.onpaint (painteventargs e) في system.windows.forms.control.paintwitherrorhandling (painteventargs e ، int16) في system.windows.forms.control.wmpaint (message & m) (Message & M) في System.windows.forms.nativeWindow.callback (Intptr HWND ، Int32 MSG ، Intptr Wparam ، Intptr LPARAM)
وفقًا لرمز الخطأ ، فإن حلقة "لكل" أدناه تسبب خطأ NullReferenceException. في الافتراضي ، يتم تعيين قائمة "المواعيد" إلى لا شيء ولا يمكنني العثور على مكان استدعاء وظيفة solveappointments.
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.
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);
}
هل لديكم أي اقتراحات؟
المحلول
DayView1_ResolveAppointments
من الواضح أنه معالج حدث ل ResolveAppointments
حدث DayView1
مراقبة. إذا For Each
هو رمي الاستثناء ، فهذا يعني ذلك appointments
هو Nothing
في ذلك الوقت ، وليس قائمة فارغة ، كما تتوقع أن تكون. يضيف
If appointments Is Nothing Then
Return
End If
قبل For Each
عقدة.
نصائح أخرى
يبدو أن الخاص بك Calendar.DayView
مكالمات التحكم OnResolveAppointments
تعمل ضمن تجاوزها OnPaint
. أود أن أقترح عليك فحص الكود هناك.
في غضون ذلك ، من المحتمل أن تتخطى فقط For Each
إذا appointments
هو Nothing
.