DCSIMG
WinForms - שלמה גולדברג (הרב דוטנט) - net.rabbi@gmail.com

שלמה גולדברג (הרב דוטנט) - net.rabbi@gmail.com

מרצה בסלע ויועץ בעולם ה - net.

Browse by Tags

All Tags » WinForms (RSS)
SelectAll OnGotFocus Windows.Forms.TextBox
יצא לי לא מזמן לנסות לכתוב קוד שיגרום לטקסט בתיבת הטקסט להיות במצב בחור (Selected) בזמן שתיבת הטקסט מקבלת פוקוס. הקוד הראשון שכתבתי היה כזה: protected override void OnGotFocus( EventArgs e) {     base .OnGotFocus(e);     SelectAll(); } הקוד הזה אכן עבד במידה ותיבת הטקסט קבלה את הפוקוס על ידי לחיצה על טאב, במידה והתיבה קבלה את הפוקוס על ידי קליק של העכבר הטקסט לא נבחר (למעשה זה נבחר אבל מיד נעלם – בגלל המימוש הפנימי של קליק העכבר בתיבת הטקסט). כאן מצאתי את הפתרון. private...
שליחת מקשי מקלדת לחלונות אחרים מתוך תהליכים
נניח שיש לכם מחשבון פתוח (calc.exe) ואתם רוצים מתוך קוד שלכם שהמחשבון יתחיל לעשות חישובים, מסתבר שניתן לשלוח לכל חלון אירוע מקשי מקלדת (ועכבר).   בדרך כלל כנראה לא נרצה לכתוב קוד כזה, אבל ישנם מקרים שכן, (באחד הפוסטים הבאים אני אדגים שימוש אמיתי בפתרון זה)   ראשית צריך למצוא את ה – handle של החלון שאליו אנחנו רוצים לשלוח מקשי מקלדת אליו, ניתן למצוא את החלון לפי ה – PID שלו, או לפי השם.     var p1 = Process .GetProcessById(2516); var p1 = Process .GetProcessesByName( "Calcaulator"...
BindingSource on remove item event
יצא לי לאחרונה להשתמש בפקד BindingSources ב - WindowsForms Application - תפקיד הפקד הוא לשמש מכניזם המאפשר לממש בקלות קישור בין אובייקטי המידע שלנו לבין פקדים בטופס. אחד הדברים המעניינים (והמעצבנים) שגיליתי - הוא שאם אני רוצה לדעת מתי נמחק איבר כלשהו מהרשימה (נניח שקשרתי את ה - BindingSource ל - Grid, והמשתמש מוחק שורה מההגריד), ניתן להירשם לאירוע ListChanged כך: Binder.ListChanged += binder_ListChanged; ובמתודה לבדוק private void binder_ListChanged( object sender, ListChangedEventArgs e) { if (e...
Posted: Apr 03 2012, 05:04 AM by Shlomo | with no comments
תגים:, , ,
List Control Editor
בהמשך לפוסט הקודם (חובה לקרוא לפני הפוסט הנוכחי) ננסה לשנות את ה - List Control Editor כך שיתאים לכמה Controls ולא רק ל - ListBox. (את הקוד המלא ניתן להוריד כאן ) המחלקה ListBoxItem תהפוך ל - ListControlItem ותראה כך: public class ListControlItem { public string Name { get ; set ; } public string Value { get ; set ; } public override string ToString() { if (DesignMode) { if (Name == null && Value == null ) return "ListBoxItem {}" ; return string .Format( "{0}, {1}" , Name...
Posted: Mar 15 2012, 09:39 PM by Shlomo | with no comments
תגים:,
ValueListBox - List Control Editor
( הקוד המלא להורדה ) אחד הפקדים ב - Windows Forms Application הוא - ListBox, הפקד יכול לקבל רשימה של אובייקטים ולהציג את הערך שחוזר מתוך ה - ToString. יש לפקד רק בעייה אחת, מקוד ניתן לתת ל - ListBox כל אובייקט שנרצה, אבל ב - Design Time ניתן לתת לו רק מערך של מחרוזות (אלא אם כן נעבוד עם Binding), כשנלחץ על הלחצן של עריכת ה - Items נקבל את החלון הבא: כמובן שהחלון הזה אינו מאפשר לתת ערכים שהם Key/Value. לכן הייתי צריך לשנות קצת את המימוש של הפקד. הסיבה שהחלון הזה קופץ בזמן לחיצה על ה - Items של הפקד...
Posted: Mar 14 2012, 02:13 PM by Shlomo | with 4 comment(s)
תגים:,
DataGridViewFontColumn
את הקוד המלא ניתן להוריד מכאן . יצא לי הצורך להגדיר מחלקה הנראית כך: public class EnvironmentFont { public string Name { get ; set ; } public Font Font { get ; set ; } } היה לי מערך של אובייקטים ממחלקה זו, והייתי צריך להציג אותם על גבי DataGrid בסביבת WinForm. הגדרת המשימה הייתה להציג על גבי גריד ולחיצה על התא תפתח את ה - FontDialog כדי לאפשר לבחור גופן אחר. מסתבר שלייצר עמודה מסוג מיוחד לגריד בסביבת WinForms היא לא תהליך פשוט - קיימים מאמרים שונים שמסבירים איך לעשות זאת - בפוסט זה נראה כיצד להגדיר...
Posted: Feb 25 2012, 08:15 PM by Shlomo | with no comments
תגים:,
Exception handling in application
טיפול נכון בשגיאות הוא אחד הדברים המאתגרים בפיתוח אפליקציות, לדעתי אחד הדברים השגויים לעשות זה לכתוב בכל קטע קוד try, catch בלי לעשות כלום בקטע ה - catch רק כדי לבלום את התרסקות האפליקצייה. הסיבה שהגישה הזו לא נכונה לדעתי, היא ש"טיפול" מסוג זה (כלומר לא לטפל רק להתעלם) יגרום בהכרח להתרסקות האפליקצייה במקום אחר מכיוון שאם קוד מסויים התרסק ולא עשה את העבודה כמו שצריך סביר להניח שקוד אחר המבוסס על הקוד שהתרסק לא יעבוד כמו שצריך, ובסוף התהליך כשנתרסק לא נדע את הסיבה האמיתית להתרסקות האפליקציה...
Exception Message Box
מי לא כתב את הקוד הבא: try { } catch ( Exception ex) { MessageBox .Show(ex.Message); } ובכלל הצגת הודעות באפליקציות חלונאיות תתבצע הרבה פעמים בעזרת MessageBox. מתברר (משהו יחסית ישן) שהחברה של sql server פתחו MessageBox משלהם - בטח ראיתם מתי שהוא את החלון הבא: (אם עבדתם עם Sql Server Managment Studio) לחלון הזה יש כמה פיצ'רים מאוד נחמדים, ראשית הוא נראה הרבה יותר טוב מה - MessageBox הסטנדרטי, בנוסף יש בתחתית החלון אפשרות להעתקת הודעת השגיאה ולחצן נוסף להצגת הפרטים הנוספים: כדי שתוכלו להשתמש בזה...
הפעלת Linq Queries על פקדים המכילים Collections ללא חשיפה של IEnumerable מתאים
אחד מהיכולות החזקות של השפה שאנחנו משתמשים בהם רבות זהו היכולת להפעיל Linq to Objects על כל מי שמממש את: IEnumerable<T> ב - windows forms ישנם הרבה פקדים המכילים collections - כמו TabControl, TreeView ועוד. הבעייה עם כל הפקדים הללו שהם חושפים את IEnumerable הרגיל, (ללא T) מה שגורם לכך שאי אפשר להפעיל עליהם שאילתות לינק. כדי לתקן זאת ניתן להוסיף Extension Method מתאים לכל פקד ולהמיר את ה - IEnumerable לאחד שתומך ב - Generic, לדוגמא: internal static class Extension { internal static IEnumerable...
Adding a Windows Forms Control to Web page - Part 2
בהמשך לפוסט שהראיתי איך להוסיף Windows User Control לדפי Web (בעזרת ActiveX). אני רוצה להדגים גישה למאפיינים ולמתודות של ה - User Control. גישה למאפיינים היא מאוד פשוטה. כל מאפיין שהוא public אפשר לגשת אליו בעזרת param - לדוגמא: < object id ="UserControl1" classid ="http://localhost/MyApp/ActiveXControls.dll#ActiveXControls.UserControl1"> < param name ="BorderStyle" value ="FixedSingle" /> < param name ="Enabled" value ="false"...
Adding a Windows Forms Control to Web page
בתפוז עלתה שאלה האם ניתן להוסיף Windows Form Control ל - Web Application. התשובה היא שזה אפשרי בעזרת ActiveX בצורה הבאה. מייצרים פרוייקט מסוג Windows Form Conrols מייצרים את ה - Contorl שלכם (זה יכול להיות עטיפה ל - button פשוט) אחרי הקימפול מעתיקים את ה - dll לתיקייה של ה - web (לא להוסיף reference - אלא להעתיק את ה - dll לאותה תיקייה שבה יש את הדפים). כעת ב - aspx שלכם תכתבו כך: < object id ="UserControl1" classid ="http://localhost/MyWebApp/ActiveXControls.dll#ActiveXControls...
ביעבוע של אירועי המקלדת לטופס (WinForm - KeyPreview)
נניח שאתם כותבים אפליקצייה WinForm ונרשמים לאירוע של KeyDown ואתם עושים משהו כזה private void Form1_KeyDown( object sender, KeyEventArgs e) { Text = e.KeyCode.ToString(); } זה יעבוד נהדר - עד שיהיה לכם פקדים על הדף - ברגע שזה יקרה (כלומר יהיו לכם פקדים על הטופס) הם בולעים את האירועים של המקלדת ולכן הקוד שלכם לא יקרה. כדי לפתור את זה, צריך להגדיר את המאפיין KeyPreview ל - true. כשתעשו את זה יגרום לאירועים להגיע קודם לטופס. מתוך הדוקומנטצייה: Gets or sets a value indicating whether the form will receive...
Posted: Jan 30 2010, 08:45 PM by Shlomo | with no comments
תגים:, , ,
הגדרה של FormBorderStyle עבור טפסים שהם MDI
בתפוז עלתה השאלה הבאה: יש טופס אב ויוצרים בזמן ריצה מופעים של טפסי בן ומוספים אותם לאב - במקרה שהמאפיין FormBorderStyle מוגדר כ - none על טופס הבן, מה שיקרה בפועל שלשנייה אחת יראו את המסגרת ואז זה יעלם - השאלה כיצד מתפטרים מהמסגרת לתמיד. נניח שהקוד נראה ככה: private void button1_Click( object sender, EventArgs e) { Form2 f = new Form2 (); f.MdiParent = this ; f.Show(); } למעשה הבעייה נובעת מכך ש - windows מציירת כל הזמן את כל הפקדים שעל המסך - ולכן הדרך היחידה לא לראות את המסגרת היא להגיד למערכת...
Update gui controls from other thread
באחד הפוסטים הראשונים כתבתי על דרך לעדכן controls מתוך thread אחר. אני שוב אדגים כאן את הבעייה בקצרה, אם ננסה להריץ את הקוד הבא: 1 private void button1_Click( object sender, EventArgs e) 2 { 3 Thread t = new Thread ( new ThreadStart (target)); 4 t.Start(); 5 } 6 7 private void target() 8 { 9 this .Text = "ddddd" ; 10 } נקבל את השגיאה הבאה: כמובן שההסבר הוא פשוט, בגלל ענייני Security אסור לשנות Gui של controls שנוצרו ב thread אחר. אז יש כמה וכמה שיטות להתגבר על זה, מקודם מצאתי שיטה חדשה...