פוקוס על כפתור לא עובד

חגי פאהן

משתמש סופר מקוצען
מנוי פרימיום
בוגר/תלמיד פרוג
עיצוב גרפי
עימוד ספרים
בעזהי"ת

בתוכנה שבנויה ב-c# winforms. נפתחת חלונית עם כפתורים. בזמן הפתיחה יש כמה פעולות וכשהן נגמרות כפתור אחד צריך להיות מסומן. אני עושה
קוד:
btn.focus();
ב-load, לפני הפעולות, אחרי הפעולות, והוא לא שם עלי! אני עובר בדיבאג, עובר על השורות האלה והוא מבצע אותן, אבל focused נשאר false.
 

מ.ש.

משתמש מקצוען
הנדסת תוכנה
D I G I T A L
עדין רלוונטי?
יתכן שזה קורה מכיון שהוא עוד לא טען את הטופס.
ניסתי עכשיו לעשות את זה בלי ועם טיימר.
עם עשיתי ממש בעת הטעינה, לא עבד, אבל אם הפעלתי באמצעות טיימר, עבד מצוין.
מצרפת כאן את דוגמת הקוד.
קוד:
private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Enabled=true;
        }

כאשר את מרווח הזמן השארתי כמו ברירת המחדל-100 MS
ובארוע של TICK לTIMER כתבתי את הקוד הבא
קוד:
private void timer1_Tick(object sender, EventArgs e)
        {
            timer1.Enabled = false;
            button2.Focus();
        }

בהצלחה.
 

חגי פאהן

משתמש סופר מקוצען
מנוי פרימיום
בוגר/תלמיד פרוג
עיצוב גרפי
עימוד ספרים
יתכן שזה קורה מכיון שהוא עוד לא טען את הטופס.
ניסתי עכשיו לעשות את זה בלי ועם טיימר.
אם עשיתי ממש בעת הטעינה, לא עבד, אבל אם הפעלתי באמצעות טיימר, עבד מצוין.
נפלאות הבריאה. לראות ולא להאמין.

כרגע שיניתי את ה-tab stop של תיבת הטקסט שהוא כן עמד עליה ל-false, והוא נאלץ בעל כרחו לגלוש אל הכפתור הרצוי. אם אצטרך בעתיד גישה גם לטקסט ההוא אוכל להשתמש בטיימר. ואולי גם שינוי ה-tab index יעזור? צ"ב.
 

Aharono

משתמש פעיל
D I G I T A L
אפשרות יותר פשוטה מטיימר, זה לקרוא ל ()btn.Select, שאפשרות זו תעבוד אפילו ב Constructor או ב OnLoad.

והשאלות העולות מאליהן, מה ההבדל בין השניים ולמה זה עובד? אז focus זו הגדרה כללית לכל המערכת הפעלה, שזה האובייקט שמקבל את הevents של המקלדת (הקלדה, אנטר וכיו"ב), מה שאין כן לselect שזו הגדרה פנימית של ה Form למה שמסומן (לצורך הענין, מספר פריטים ברשימה יכולים להיות selected).

לפי זה, כאשר ה Form נטען (ב constructor או ב OnLoad), הוא עוד לא מוצג ולכן אף Control בForm לא יכול לבקש מהווינדוס להיות ה Focused, שהרי ברגע זה, לחיצה על מקש במקלדת לא תגרום לשום פעולה (אם אין Textbox או Button, אין משמעות ללחיצה). ממילא, קריאה ל Focus בשלבב זה, לא תעשה כלום (ולמעשה, תחזיר false).

אבל select זוהי הגדרה לוגית ל Form, לכן, אפילו שה Control עוד לא מוצג, ניתן להגדיר אותו כSelected וממילא כאשר יוצג ה Form, הוא יהפוך את ה Control המדובר ל Focused.
 

אולי מעניין אותך גם...

הפרק היומי

הפרק היומי! כל ערב פרק תהילים חדש. הצטרפו אלינו לקריאת תהילים משותפת!


תהילים פרק קיט א'

א אַשְׁרֵי תְמִימֵי דָרֶךְ הַהֹלְכִים בְּתוֹרַת יְהוָה:ב אַשְׁרֵי נֹצְרֵי עֵדֹתָיו בְּכָל לֵב יִדְרְשׁוּהוּ:ג אַף לֹא פָעֲלוּ עַוְלָה בִּדְרָכָיו הָלָכוּ:ד אַתָּה צִוִּיתָה פִקֻּדֶיךָ לִשְׁמֹר מְאֹד:ה אַחֲלַי יִכֹּנוּ דְרָכָי לִשְׁמֹר חֻקֶּיךָ:ו אָז לֹא אֵבוֹשׁ בְּהַבִּיטִי אֶל כָּל מִצְוֹתֶיךָ:ז אוֹדְךָ בְּיֹשֶׁר לֵבָב בְּלָמְדִי מִשְׁפְּטֵי צִדְקֶךָ:ח אֶת חֻקֶּיךָ אֶשְׁמֹר אַל תַּעַזְבֵנִי עַד מְאֹד:
נקרא  32  פעמים

לוח מודעות

למעלה