קריאת שורת הטקסט ב-ComboBox במהלך הקלדה - כשהרשימה פתוחה
-
בס"ד
שאלה טיפשית וקטנה (קטנה במהות, לא בניסוח :mrgreen: )
יש לי קומבובוקס ב- VB.NET WinForm. נקרא לו cb.
אני מעוניין "לצוד" את ההקשות בתיבה, בכדי לבצע סדרת פעולות לאחר הקשה על אנטר (הסברים יבואו).
עיקר הפעולות הן על הטקסט שנרשם בשורת הטקסט של הקומבובוקס (שבסיום הקלדתו הוקש האנטר).
בעיקרון אני יכול לקבל את הטקסט באמצעות הפרופרטי: cb.text , ובדומה ל- TextBox.העניין הוא, שאם אני רוצה לקרוא את הטקסט כשחלונית ההצעות פתוחה - הטקסט לא שמור בשום מקום. אבל אני צריך אותו! :roll:
אז כמובן שאני יכול ליצור משתנה סטרינג משלי, וללכוד כל הקשה ולהוסיף לסטרינג את האות שהוקשה או למחוק לפי העניין.
אבל זה נראה לי דרך של "אויבער חוכם", שאולי נכונה מעשית אבל וודאי לא תקנית. (ומסתמא יצוצו גם הפתעות, כגון בשינוי באמצע המחרוזת ועוד).ובכן, חברי הפורום הנכבדים, תואילו להורות לי את דרך המלך?
תודה רבה רבה!(הסבר למעוניינים:
בתוכנה המהוללת מאתמול, של תקשור עם מסדי MySQL,
הוספתי אופצייה של כתיבת והרצת שאילתות SQL ידניות,
כשאת השאילתא אני כותב בשורת הטקסט של הקומבובוקס,
ובלחיצה על אנטר לאחר כתיבת השאילתא, מעבר להרצת השאילתא כמובן,
הוא גם מוסיף את השאילתא לרשימת הצעות הקומבובוקס, בשביל לחסוך לכתוב ידנית את אותה השאילתא שוב ושוב.
העניין הוא, שברגע שרשימת ההצעות נפתחה, למשל כי כתבתי בעבר שאילתא שמתחילה דומה,
הוא פשוט מתעלם באלגנטיות מהטקסט שכתוב בשורת הקומבובוקס,
וכשאני לוחץ אנטר בסיום כתיבת השאילתא, הוא פשוט מריץ את השאילתא: "", וגם מוסיף אותה לרשימת הפריטים בקומבובוקס... :lol: )פורסם במקור בפורום CODE613 ב28/11/2017 15:41 (+02:00)
-
א. כל הכבוד, נראה שאתה שוחה בחומר כמו דג במים
ב. התופעה לא מובנת ומטסט קצר שערכתי לא גם לא מתרחשת אצלי.
גם בעת שהתיבה פתוחה כל הקשה משנה את הערך Text של הקומבובוקס.
נסה נא טסט בפרוייקט קטן כדי לבודד את הבעיה.
כמו"כ יש לי חשד קל בקשר לרגע לחיצת האנטר, אם איזה אירוע לכדת את זמן זה? זה מה שמריץ את השאילתה?פורסם במקור בפורום CODE613 ב28/11/2017 16:20 (+02:00)
-
בס"ד
**א.**במים רדודים :lol:
**ב.**מוזר x2.
כי לדעתי כן התחלתי לעלות על הבעייה (אחרי פרסום השאלה, ולפני ריצה למנחה )
גיליתי שאם אני כותב טקסט עם "מגירה פתוחה", ברגע שהקומבובוקס מאבד פוקוס - המגירה נסגרת והטקסט נמחק!ובשבילך פתחתי פרויקט חדש ריק, הוספתי קומבובוקס, פתחתי מגירה והקלדתי, לחצתי Alt-Tab לקפיצה לחלון אחר, חזרתי, ואין טקסט...
המשכתי בסקרנות ל Word, פתחתי את רשימת הגופנים, הקלדתי ידנית שם גופן שלא קיים, Alt-Tab הלוך וחזור, ו...
המגירה סגורה ואזהרה מ Word שהגופן "שבחרתי" לא קיים.
דהיינו גם ב Word המגירה נסגרה אוטומטית, אלא שב-Word יש התערבות בשלב סגירת המגירה ש"מאשרת" בשבילי את הטקסט שהקלדתי.ניסיתי לבדוק באירוע של DropDownClosed מה מצב ה-cb.text - אבל כבר שם הוא ריק.
המחשבה הראשונה היא לחפש אירוע בשם DropDownClosing כמקום המתאים לטפל בכאלו דברים, אבל העניין הוא שלא קיים כזה אירוע...ג. את האנטר אני לוכד עם אירוע KeyDown, שמוביל לשגרה שהשורה הראשונה שלה היא:
If e.KeyCode <> Keys.Enter Then Exit Sub
ובהמשך השגרה (אחרי שהיא מוסיפה את השאילתא החדשה לפריטי הקומבובוקס) היא פשוט "לוחצת" על הלחצן של "בצע שאילתא":
btnManual_Click(sender, Nothing)תודה רבה!
פורסם במקור בפורום CODE613 ב28/11/2017 17:40 (+02:00)
-
בס"ד
שני עדכונים מוזרים נוספים:
-
כאשר הפרופרטי AutoCompleteMode על מצב none, בהקלדה עם "מגירה פתוחה" - הטקסט נמחק, אבל הפרופרטי Text נשמר... :?
הבעייה המלאה קיימת "רק" במצבי ההשלמה האוטומטית למיניהם. כמובן שבלי השלמה אוטומטית הקומבובוקס יכול לחזור למאורה. -
כאשר משתמשים באירוע KeyDown ולוחצים אנטר עם מגירה פתוחה, האירוע חוזר פעמיים. (רק אנטר מחזיר פעמיים) :?:
מה הולך פה היום?
פורסם במקור בפורום CODE613 ב28/11/2017 19:15 (+02:00)
-
-
היה עליך לומר בדיוק איזה מאפיינים הגדרת, זה קריטי להבנת הבעיה.
אכן זו בדיוק ההתנהגות של ההשלמה אוטומטית, כאשר הרשימה פתוחה אז הוא במצב למצוא התאמה, ולחיצה על אנטר קובעת את המתאים כטקטס הנבחר. במקרה שאין מתאים אז זה כלום.
בקשר לKeyDown פעמיים אינני יודע בדיוק למה זה אבל זה לא אמור להפריע לך.
שים לב לעקוב אחרי ההתנהגות שלך\של המשתמש. למה הוא מגיע למצב של הקלדה שונה תוך כדי שתיבת ההצעות פתוחה? הוא עורך אפשרות קיימת? עליך לעקוב אחרי כוונת המשתמש ולתת לו את הפקד ואת הפריסה האופטימליים לצרכיו. בדרך כלל התנהגות לא רצוייה של פקדים מעידה שהם פשוט בחירה לא נכונה.פורסם במקור בפורום CODE613 ב28/11/2017 19:36 (+02:00)
-
בס"ד
טוב. נראה לי שהגעתי אל המנוחה ואל הנחלה.
העניין הוא שהתערבבו לי 2 בעיות שונות שגרמו לתוצאה דומה - בלי קשר בין אחת לשניה, ובשילוב עם הסיבוב הכפול של האירוע KeyDown.
אם באמת מקלידים משהו כשהרשימה פתוחה ועוזבים פוקוס עם רשימה פתוחה - זה מוחק את הטקסט. (@דוד ל.ט., לא משנה באיזה מצב השלמה, גם ב-none הוא מוחק לך את מה שכתבת, למרות שלא ביקשת ממנו "טובות" שישלים לך).
אבל, הטעות שלי שבלבלה אותי היתה,
אני רציתי תמיד לדחוף את השאילתא החדשה לראש רשימת השאילתות בקומבובוקס (insert לאינדקס 0, במקום add לסוף הרשימה).
בנוסף, הגדרתי שאם השאילתא נשאלה בעבר והיא קיימת ברשימה, שקודם היא תמחק מהמיקום הישן, ומשם ימשיך כרגיל עם ה insert לאינדקס 0.
מה שפיספסתי בשלב המחיקה, שמכיון שהשאילתא ברשימה והטסקט בתיבה זהים, ברגע שמחקתי מהרשימה זה איפס לי גם את הטקסט בתיבה,
ואז השורה הבאה שעושה insert הכניסה מחרוזת ריקה.וכדי להוסיף שמן למדורה,
מכיון שהאירוע KeyDown שמבצע את הפעולות האלו - עושה משום מה שני סיבובים, וכנ"ל,
כל שאילתא שהקלדתי, הסיבוב הראשון היה מכניס אותה לרשימה,
והסיבוב השני היה מוצא אותה ברשימה ו"מוחק" אותה מהרשימה ומהתיבה, ונשארתי עם מחרוזת ריקה...עכשיו הכל בא על מקומו בשלום:
Dim current As String = cb.Text
If cb.Items.Contains(current) Then cb.Items.Remove(current)
cb.Items.Insert(0, current)
cb.SelectedIndex = 0ושוב תודה רבה ל-@דוד ל.ט הצדיק!
פורסם במקור בפורום CODE613 ב28/11/2017 23:13 (+02:00)