عند تحليل الشيفرة التي قدمتها، يظهر أن لديك تطبيق C# WPF يتضمن نموذجًا يقوم بإضافة مدربين (Instructors) إلى قائمة (List) تظهر في ListView. ومع ذلك، تتسبب مشكلة محددة في ظهور رسالة الخطأ “object reference not set to an instance of an object”.
-
تكامل واجهة المستخدم المشفرة مع Perl.01/04/2024
-
مشكلة GDB على macOS Sierra01/04/2024
السبب الرئيسي لحدوث هذا الخطأ هو أنك تقوم بإنشاء متغير محلي جديد لـ instList
داخل الميثود MainWindow()
بدلاً من استخدام المتغير العام الذي قمت بتعريفه في الفئة MainWindow
. بمجرد خروجك من MainWindow()
، يتم تجاهل المتغير المحلي وتبقى القائمة instList
العامة غير مهيأة.
لحل هذه المشكلة، يجب أن تقوم بإزالة تعريف المتغير المحلي داخل MainWindow()
حتى يتم استخدام المتغير العام الذي قمت بتعريفه في بداية الفئة. يجب أن يكون الكود كالتالي:
csharppublic partial class MainWindow : Window
{
public List instList;
public MainWindow()
{
InitializeComponent();
instList = new List(); // تعديل هنا لاستخدام المتغير العام
lvInstructorList.ItemsSource = instList;
}
private void btnCreateInstructor_Click(object sender, RoutedEventArgs e)
{
spCreateInstructor.Visibility = (spCreateInstructor.Visibility == Visibility.Hidden) ? Visibility.Visible : Visibility.Hidden;
}
private void btnInstructorSubmit_Click(object sender, RoutedEventArgs e)
{
instList.Add(new Instructor() { firstName = txtInstructorFirstName.Text, lastName = txtInstructorLastName.Text });
lvInstructorList.ItemsSource = instList;
}
}
مع هذا التعديل، يجب أن يتم الآن تهيئة instList
بشكل صحيح ولن تظهر رسالة الخطأ التي تقول “object reference not set to an instance of an object”.
المزيد من المعلومات
بعد التعديل الذي قمت به في الشيفرة، يجب أن تعمل الآن الوظيفة كما هو متوقع دون ظهور أي أخطاء. لكن دعنا نلقي نظرة أعمق على بعض النقاط التي يمكن أن تساعد في تحسين فهمك للمشكلة وتطوير قدراتك في البرمجة باستخدام C# و WPF.
أولاً، يبدو أنك تستخدم تطبيق WPF (Windows Presentation Foundation)، وهو إطار عمل لبناء تطبيقات سطح المكتب على نظام التشغيل Windows. WPF يوفر واجهة مستخدم رسومية (GUI) قوية ومرنة تمكنك من إنشاء تطبيقات متقدمة بسهولة.
ثانيًا، قمت بإنشاء فئة Instructor
التي تحتوي على خصائص firstName
و lastName
لتمثيل المعلومات التي يمكن إدخالها من قبل المستخدم. هذا يعتبر نهجًا جيدًا لتنظيم البيانات في تطبيقك.
ثالثًا، استخدمت قائمة instList
من نوع List
لتخزين مجموعة من الكائنات من النوع Instructor
. هذا يتيح لك إضافة وحذف وتعديل العناصر بسهولة دون الحاجة إلى القلق بشأن عمليات تحرير الذاكرة.
رابعًا، في طريقة MainWindow()
، قمت بتعريف instList
مرتين، مرة كمتغير محلي ومرة كمتغير عام. بتعريفه مرة أخرى كمتغير محلي، تجاهل البرنامج المتغير العام الذي تم تعريفه في بداية الفئة، مما أدى إلى عدم تهيئته بشكل صحيح وظهور رسالة الخطأ “object reference not set to an instance of an object”.
بالقيام بالتعديل المقترح، أزلت تعريف المتغير المحلي واستخدمت المتغير العام، مما يضمن أن القائمة ستتم تهيئتها بشكل صحيح وسيتمكن البرنامج من إضافة العناصر إليها بدون مشاكل.
أخيرًا، بعد إضافة العنصر إلى instList
، يقوم البرنامج بتحديث lvInstructorList.ItemsSource
ليعكس التغييرات الجديدة في ListView الذي يُظهر البيانات للمستخدم.
بهذا، يمكنك الآن تشغيل التطبيق بدون مشاكل وإضافة مدربين جدد إلى قائمتك بسهولة. باستخدام هذا النهج، يمكنك توسيع تطبيقك وإضافة مزيد من الميزات مثل تحرير وحذف العناصر، وتخصيص واجهة المستخدم، وغيرها، لجعل تجربة المستخدم أفضل وأكثر فعالية.