السلام عليكم...
العديد من المكونات تعتبر بعض المفاتيح كمفاتيح تنقل (Navigation Keys) و ليست مفاتيح إدخال (Input Keys). و بالتالي لا يتم قدح الحدث KeyDown لتلك النفاتيح. مثلاً المكون Button يعامل مفاتيح الأسهم كمفاتيح تنقل و بالتالي لا يقع الحدث KeyDown مع مفاتيح الأسهم على الـ Button.
نفس الأمر يكون مع معظم المكونات بالنسبة إلى المفتاح Tab. أي أنه يُعتبر مفتاح تنقل و ليس مفتاح إدخال.
للتعامل مع هذه الحالات لديك خياران بسيطان، و كلاهما يحتاج إلى استعمال الحدث PreviewKeyDown الذي يحدث قبل الحدث KeyDown مهما كان المفتاح المضغوط:
1. إذا كنت تريد التعامل مع ضغط المفتاح Tab مع السماح بالانتقال إلى المكون التالي (لأن المفتاح Tab يعمل بشكل افتراضي على الانتقال إلى المكون التالي) فاكتب الكود الذي تريده مباشرة في إجراء الحدث PreviewKeyDown. لا يمكنك هنا إلغاء السلوك الافتراضي للمفتاح Tab (أو أي مفتاح آخر) لأن البارامتر e الذي يحتوي على بارامترات الحدث (من النوع PreviewKeyDownEventArgs) لا يحتوي على الخاصية Handled.
2. إذا كنت تريد التعامل مع ضغط المفتاح Tab مع إلغاء عمله الافتراضي (أي منع الانتقال إلى المكون التالي):
أ. اكتب في الحدث PreviewKeyDown الكود التالي:
كود :
If e.KeyCode = Keys.Tab Then
e.IsInputKey = True
End If
حيث هذا الكود يجعل المكون يعتبر أن المفتاح Tab هو مفتاح إدخال، و بالتالي سيعمل على قدح الحدث KeyDown.
ب. اذهب إلى الحدث KeyDown و اكتب الكود الذي تريده.
* ستلاحظ في الحالة الثانية (أي استعمال e.IsInputKey = True و كتابة الكود في الحدث KeyDown) أن الـ Focus لا تنتقل من المكون إلى المكون الذي يليه.
نرجو الاستفادة و السلام.