DataGridViewFontColumn

25 בפברואר 2012

תגיות: ,
אין תגובות


 


את הקוד המלא ניתן להוריד מכאן

 

יצא לי הצורך להגדיר מחלקה הנראית כך:

 



public class EnvironmentFont


{


    public string Name { get; set; }


    public Font Font { get; set; }


}


 

היה לי מערך של אובייקטים ממחלקה זו, והייתי צריך להציג אותם על גבי DataGrid בסביבת WinForm.

 

הגדרת המשימה הייתה להציג על גבי גריד ולחיצה על התא תפתח את ה – FontDialog כדי לאפשר לבחור גופן אחר.

 

 

מסתבר שלייצר עמודה מסוג מיוחד לגריד בסביבת WinForms היא לא תהליך פשוט – קיימים מאמרים שונים שמסבירים איך לעשות זאת – בפוסט זה נראה כיצד להגדיר את העמודה.

 

 

ראשית נכתוב מחלקה היורשת מ – DataGridViewTextBoxCell שתראה כך:

 



public class DataGridViewFontCell : DataGridViewTextBoxCell


{


    public override Type ValueType


    {


        get


        {


            return typeof(Font);


        }


    }


 


    public override Type EditType


    {


        get


        {


            return typeof(GridFontPicker);


        }


    }


 


    public override object DefaultNewRowValue


    {


        get


        {


            return new Font("arial", 12, FontStyle.Regular);


        }


    }


 


    public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)


    {


        base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);


 


        GridFontPicker fontPicker = this.DataGridView.EditingControl as GridFontPicker;


        if (fontPicker != null)


        {


            fontPicker.EditingControlFormattedValue = initialFormattedValue;


        }


    }


}


 

 

ישנם הרבה מתודות שניתן לדרוס עבור פונקציונליות שנרצה לקבל, במקרה שלנו נדרוס את המאפיין ValueType בו נגדיר מהי סוג העמודה, את המאפיין EditType בו ניתן את הפקד שיפתח בזמן עריכת התא (מחלקה היורשת מ – Control ומממשת את הממשק IDataGridViewEditingControl), נדרוס את המאפיין DefaultNewRowValue בו נגדיר את פונט ברירת המחדל, ונדרוס את המתודה הכי חשובה InitializeEditingControl בו נפנה לפקד שייצרנו בשביל העריכה (נראה בהמשך) ונשלח את הערך הנוכחי שיש בתא.

 

 

כעת נייצר מחלקה שתירש מ – DataGridViewColumn שתיראה כך:

 



public class DataGridViewFontColumn : DataGridViewColumn


{


    public DataGridViewFontColumn()


        : base(new DataGridViewFontCell())


    {


    }


}


 

 

כשנייצר את עמודת הגריד באפלייקציה, עבור העמודה של הפונט נשלח מופע של המחלקה הזו: לדוגמא:

 



dataGridView1.Columns.Add(new DataGridViewFontColumn());


 

 

הדבר האחרון שנשאר לראות, זה את המחלקה עבור עריכת התא.

 

למעשה מה שנעשה הוא יצירת UserControl שבזמן שצריך הוא יקפיץ את ה – FontDialog.

 

אני לא מציג כאן את כל המתודות – רק את החשובות, תוכלו להוריד את כל הפרוייקט מהלינק בתחילת הפוסט.

 



public partial class GridFontPicker : UserControl, IDataGridViewEditingControl


{


    public void PrepareEditingControlForEdit(bool selectAll)


    {


        if (fontDialog1.ShowDialog() == DialogResult.OK)


        {


            label1.Text = fontDialog1.Font.ConvertToString();


            EditingControlValueChanged = true;


            this.EditingControlDataGridView.NotifyCurrentCellDirty(true);


        }


    }


 


    public object EditingControlFormattedValue


    {


        get


        {


            return fontDialog1.Font.ConvertToString();


        }


        set


        {


            if (value != null)


            {


                Font font1 = value.ToString().ConvertToFont();


 


                fontDialog1.Font = font1;


                label1.Text = value.ToString();


            }


        }


    }


}


 

למעשה בגלל שאנחנו לא באמת מאפשרים למשתמש לערוך משהו רק בעזרת FontDialog הקוד הוא הרבה יותר פשוט.

 

יש את המאפיין EdititngControlFormattedValue שבו נקבל את הערך ונחזיר אותו בזמן סיום העריכה.

 

ההמרה בין מחרוזת למחלקת Font, מתבצעת בעזרת הקוד הבא:

 



public static class Converters


{


    private static TypeConverter _fontConverter = TypeDescriptor.GetConverter(typeof(Font));


 


    public static Font ConvertToFont(this string value)


    {


        return (Font)_fontConverter.ConvertFromString(value);


    }


 


    public static string ConvertToString(this Font font)


    {


        return _fontConverter.ConvertToString(font);


 


 

 

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

 

 

ישנם עוד מאפיינים ומתודות שאפשר להשתמש בהם – בפוסט הבא אני אראה את DataGridViewColorColumn שבו יש שימוש בעוד מתודות

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *