Bonjour à tout le monde.


Je souhaite héberger un contrôle qui s'appelle "DataGridViewSearchColumn" dans des cellules DataGridView Windows Forms.


Cette contrôle s'appelle BISTextBoxSearch, il admet un champ TextBox et Button.


BISTextBoxSearch admet un propriété "Image". Je souhaite ajouter la propriété "ImageButton" à la contrôle "DataGridViewSearchColumn" pour modifier l'image de BISTextBoxSearch. Je réalise le code suivant qui ne fonctionne pas.



Ma question: Comment on peut ajouter un propriété à la "DataGridViewSearchColumn" pour modifier l'image de "BISTextBoxSearch" ?



Voila mon code

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
 
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
 
namespace BIS.Composant
{
 
    #region **** DataGridViewSearchColumn ****
    // Représente une colonne dans un contrôle DataGridView. 
    public class DataGridViewSearchColumn : DataGridViewColumn
    {
        public DataGridViewSearchColumn()
            : base(new SearchCell())
        {
            CellTemplate = new SearchCell();
        }
 
        // CellTemplate: Obtient ou définit le modèle utilisé pour créer des cellules. 
        public override DataGridViewCell CellTemplate
        {
            get
            {
                return base.CellTemplate;
            }
            set
            {
                // Ensure that the cell used for the template is a CalendarCell.
                if (value != null &&
                    !value.GetType().IsAssignableFrom(typeof(SearchCell)))
                {
                    throw new InvalidCastException("Must be a SearchCell");
                }
                base.CellTemplate = value;
            }
        }
 
        [Browsable(true), Category("Propriétés: DataGridViewSearchColumn"), Description("Image.")]
        public Image ImageButton
        {
            get { return ((SearchCell)this.CellTemplate).ImageButton; }
            set {
                ((SearchCell)this.CellTemplate).ImageButton = value;
                //DataGridView
                if (this.DataGridView == null)
                    return;
                int rowCount = this.DataGridView.RowCount;
                for (int i = 0; i < rowCount; i++)
                {
                    DataGridViewRow r = this.DataGridView.Rows.SharedRow(i);
                    ((SearchCell)r.Cells[this.Index]).ImageButton = value;
                }
                }
        }
 
    }
    #endregion
 
    #region **** SearchCell ****
 
    public class SearchCell : DataGridViewTextBoxCell
    {
        private Image _Image;
 
        public SearchCell()
            : base()
        {
        }
 
        [Browsable(true), Category("Propriétés: DataGridViewSearchColumn"), Description("Image.")]
        public Image ImageButton
        {
            get { return _Image; }
            set { this._Image = value; }
        }
 
        // InitializeEditingControl: Attache et initialise le contrôle d'édition hébergé.
        public override void InitializeEditingControl(int rowIndex, object
            initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
        {
            // Set the value of the editing control to the current cell value.
            base.InitializeEditingControl(rowIndex, initialFormattedValue,
                dataGridViewCellStyle);
            SearchEditingControl ctl =
                DataGridView.EditingControl as SearchEditingControl;
            if (this.Value != null)
            {
                ctl.Text = this.Value.ToString();
            }
        }
 
        public override Type EditType
        {
            get
            {
                // Return the type of the editing contol that SearchCell uses.
                return typeof(SearchEditingControl);
            }
        }
 
        public override Type ValueType
        {
            get
            {
                // Return the type of the value that SearchCell contains.
                return typeof(string);
            }
        }
 
        public override object DefaultNewRowValue
        {
            get
            {
                // Use the current date and time as the default value.
                return "";
            }
        }
 
    }
    #endregion
 
    #region **** SearchEditingControl ****
 
    class SearchEditingControl : BISTextBoxSearch, IDataGridViewEditingControl
    {
        DataGridView dataGridView;
        private bool valueChanged = false;
        int rowIndex;
 
        public SearchEditingControl()
        {
 
        }
 
        // Implements the IDataGridViewEditingControl.EditingControlFormattedValue 
        // Obtient ou définit la valeur mise en forme de la cellule en cours de modification par l'éditeur. 
        public object EditingControlFormattedValue
        {
            get
            {
               return this.Text;
            }
            set
            {
                if (value is String)
                {
                   this.Value = (String)value;
                }
            }
        }
 
        // Implements the 
        // Récupère la valeur mise en forme de la cellule. 
        public object GetEditingControlFormattedValue(
            DataGridViewDataErrorContexts context)
        {
            return EditingControlFormattedValue;
        }
 
        // Implements the 
        // Modifie l'interface utilisateur du contrôle pour qu'elle soit cohérente avec le style de cellule spécifié. 
        public void ApplyCellStyleToEditingControl(
            DataGridViewCellStyle dataGridViewCellStyle)
        {
            this.Font = dataGridViewCellStyle.Font;
            this.ForeColor = dataGridViewCellStyle.ForeColor;
            this.BackColor = dataGridViewCellStyle.BackColor;
        }
 
        // Obtient ou définit l'index de la ligne parente de la cellule d'hébergement. 
        // property.
        public int EditingControlRowIndex
        {
            get
            {
                return rowIndex;
            }
            set
            {
                rowIndex = value;
            }
        }
 
        // Implements the IDataGridViewEditingControl.EditingControlWantsInputKey 
        // Détermine si la touche spécifiée est une touche de saisie normale que le contrôle d'édition doit traiter ou une touche spéciale que DataGridView doit traiter. 
        public bool EditingControlWantsInputKey(
            Keys key, bool dataGridViewWantsInputKey)
        {
            // Let the DateTimePicker handle the keys listed.
            switch (key & Keys.KeyCode)
            {
                case Keys.Left:
                case Keys.Up:
                case Keys.Down:
                case Keys.Right:
                case Keys.Home:
                case Keys.End:
                case Keys.PageDown:
                case Keys.PageUp:
                    return true;
                default:
                    return !dataGridViewWantsInputKey;
            }
        }
 
        // Implements the IDataGridViewEditingControl.PrepareEditingControlForEdit 
        // Prépare la cellule actuellement sélectionnée pour la modification. 
        public void PrepareEditingControlForEdit(bool selectAll)
        {
            // No preparation needs to be done.
        }
 
        // Implements the IDataGridViewEditingControl
        // Obtient ou définit une valeur indiquant si le contenu de la cellule doit être repositionné à chaque fois que la valeur change.
        public bool RepositionEditingControlOnValueChange
        {
            get
            {
                return false;
            }
        }
 
        // Implements the IDataGridViewEditingControl
        // Obtient ou définit le DataGridView qui contient la cellule.
        public DataGridView EditingControlDataGridView
        {
            get
            {
                return dataGridView;
            }
            set
            {
                dataGridView = value;
            }
        }
 
        // Implements the IDataGridViewEditingControl
        // Obtient ou définit une valeur indiquant si la valeur du contrôle d'édition diffère de la valeur de la cellule d'hébergement. 
        public bool EditingControlValueChanged
        {
            get
            {
                return valueChanged;
            }
            set
            {
                valueChanged = value;
            }
        }
 
        // Implements the IDataGridViewEditingControl
        // Obtient le curseur utilisé lorsque le pointeur de la souris se trouve sur DataGridView.EditingPanel mais pas sur le contrôle d'édition. 
        public Cursor EditingPanelCursor
        {
            get
            {
                return base.Cursor;
            }
        }
 
        protected override void OnTextChanged(EventArgs e)
        {
            valueChanged = true;
            //NotifyCurrentCellDirty: Notifie le DataGridView que la cellule active comporte des modifications non validées. 
            this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
            base.OnTextChanged(e);
        }
 
    }
    #endregion
 
}