كيف يمكنني التعامل مع نماذج ويندوز datetimepicker argumentoutoutoutoutofrangeException؟

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

سؤال

لقد قمت بتشغيل علة محددة للغاية مع عنصر التحكم DatetimeMepicker في نماذج Windows. يحتوي التحكم على تنسيق مخصص (MM-YYYY -> 01/2010) - شهر / سنة بطاقة ائتمان. اليوم هو 29 سبتمبر. إذا حدد المستخدم التحكم، ويستخدم لوحة المفاتيح لتعيين الشهر حتى فبراير، فسيقوم عنصر التحكم برمي ArgumentoutOutOutoFrangeException. لا يوجد مثل هذا التاريخ 29 فبراير 2009. سيحدث هذا أيضا في أيام الحادي والثلاثين، والانتقال إلى شهرا مع 30 يوما فقط.

سيكون من السهل بما يكفي لمعالجة ذلك عن طريق تحديد اليوم إلى "01"، ومع ذلك، يمكن للمستخدم النقر فوق التقويم لتحديد 30th يدويا، ثم استخدم لوحة المفاتيح لتحديد فبراير.

كيف يمكن القبض على هذا الاستثناء، عندما يحدث الإدخال على واجهة المستخدم الرسومية وليس حقا في التعليمات البرمجية؟ لقد حاولنا اللحاق به في حدث TextChanged، ولكن هذا بالفعل متأخر جدا. تم إلقاء الاستثناء بالفعل.

هل هناك أي طريقة للتعامل مع هذه القضية؟ سيكون من الرائع أن يتحكم التحكم تلقائيا في اليوم إلى أعلى قيمة لهذا الشهر. أو على الأقل إذا مرت الاستثناء من خلال حدث.

(أنا أدرك أننا يمكن أن نختصر الحدث القوي ووضع اليوم إلى 01 في كل مرة، ولكن هذا يشعر "Hacky").

هل كانت مفيدة؟

المحلول

إذا كنت تريد فقط الشهر والسنة، فقد يبدو لي أنه لا ينبغي أن تستخدم Deadepicker في المقام الأول ... لماذا يقدم المستخدم مع عنصر تحكم يتضمن يوم الشهر عندما لا يستخدمون هو - هي؟

أود أن أقترح عليك إما استخدام هبوطين، واحد للسنة وواحدة لهذا الشهر. سيكون ذلك مألوفا للمستخدمين من كل صفحة دفع عبر الإنترنت فقط، وسوف تتجنب المشكلة.

تحرير: حسنا، للإجابة على السؤال المحدد من استثناءات التعامل، يمكنك استخدام Application.ThreadException الحدث، ولكن سأحاول تجنب الاضطرار إلى القيام بذلك إذا استطعت.

نصائح أخرى

هل يمكنك ضبط DatetimePicker عرض خاصية TRUE بحيث يصبح السيطرة سبينر بدلا من انخفاض التقويم؟

لا توجد وسيلة يمكنك فقط إدخال الشهر / السنة دون اليوم. إذا لم يتم تحديد أي يوم بشكل صريح يتم استخدام اليوم الحالي. يحتاج DateTimePicker إلى جميع البيانات - لا يهم إذا أخفت ذلك وراء القناع.

الطريقة الوحيدة لجعل datetimepicker تفعل ذلك، إجابة .NET نموذجية, ، لكتابة صفك الخاص الذي يستمد من DateTimePicker ولها طريقة مخصصة للتعامل مع المدخلات دون أيام. على أي حال، لن تفلت دون تحديد اليوم ...

إذا كنت قد: أقترح MaskedTextBox مع تعيين قناع إلى '00 / 0000 '(تنسيق بطاقة الائتمان) ثم التحقق من صحة المدخلات.

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