"لم يتم ضبط مرجع الكائن على مثيل لكائن" أثناء الإضافة إلى قائمة

StackOverflow https://stackoverflow.com/questions/3011533

سؤال

أحتاج إلى بعض المساعدة في برنامجي. أحصل على هذا الخطأ عندما أقوم بتشغيل برنامج 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top