DataGridViewのColumnsはDataGridViewColumnCollectionでそのItemはDataGridViewColumnとなります。
ですので、型をチェックし、DataGridViewTextBoxColumnEXであればキャストしてください。
追記
DataGridViewCell、編集コントロールの拡張を行う場合
(編集コントロールでの数値入力のみ許可する部分は実装してありません。TextBoxを継承していますので、検索すればいろいろ方法が引っかかると思います。)
このようにすれば、通常のDataGridViewからでも使えます。
C#
1 /// <summary>
2 /// DataGridViewTextBoxCellEXオブジェクトの列を表します。
3 /// </summary>
4 public class DataGridViewTextBoxColumnEX : DataGridViewColumn
5 {
6 //CellTemplateとするDataGridViewMaskedTextBoxCellオブジェクトを指定して基本クラスのコンストラクタを呼び出す
7 public DataGridViewTextBoxColumnEX() : base(new DataGridViewTextBoxCellEX())
8 {
9 }
10
11 public Boolean 数値入力 { get; set; }
12
13 //新しいプロパティを追加しているため、Cloneメソッドをオーバーライドする必要がある
14 public override object Clone()
15 {
16 DataGridViewTextBoxColumnEX col = (DataGridViewTextBoxColumnEX)base.Clone();
17 col.数値入力 = this.数値入力;
18 return col;
19 }
20
21 //CellTemplateの取得と設定
22 public override DataGridViewCell CellTemplate
23 {
24 get
25 {
26 return base.CellTemplate;
27 }
28 set
29 {
30 // DataGridViewTextBoxCellEX以外はCellTemplateに設定できないようにする
31 if (!(value is DataGridViewTextBoxCellEX))
32 {
33 throw new InvalidCastException("DataGridViewMaskedTextBoxCellオブジェクトを指定してください。");
34 }
35 base.CellTemplate = value;
36 }
37 }
38 }
39
40 public class DataGridViewTextBoxCellEX : DataGridViewTextBoxCell
41 {
42
43 //編集コントロールを初期化する
44 //編集コントロールは別のセルや列でも使いまわされるため、初期化の必要がある
45 public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle)
46 {
47 base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle);
48
49 //編集コントロールの取得
50 TextBoxEX textEX = this.DataGridView.EditingControl as TextBoxEX;
51 if (textEX != null)
52 {
53 //Textを設定
54 string setText = initialFormattedValue as string;
55 textEX.Text = setText != null ? setText : "";
56
57 //カスタム列のプロパティを反映させる
58 DataGridViewTextBoxColumnEX column = this.OwningColumn as DataGridViewTextBoxColumnEX;
59 if (column != null)
60 {
61 textEX.数値入力 = column.数値入力;
62 }
63 }
64 }
65
66 //編集コントロールの型を指定する
67 public override Type EditType
68 {
69 get
70 {
71 return typeof(TextBoxEX);
72 }
73 }
74
75 }
76
77 public partial class TextBoxEX : TextBox, IDataGridViewEditingControl
78 {
79
80 #region プロパティ
81
82 public Boolean 数値入力 { get; set; }
83
84 #endregion
85
86 //コンストラクタ
87 public TextBoxEX()
88 {
89 this.TabStop = false;
90 }
91
92 #region IDataGridViewEditingControl メンバ
93
94 //編集コントロールで変更されたセルの値
95 public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context)
96 {
97 return this.Text;
98 }
99
100 //編集コントロールで変更されたセルの値
101 public object EditingControlFormattedValue
102 {
103 get
104 {
105 return this.GetEditingControlFormattedValue(DataGridViewDataErrorContexts.Formatting);
106 }
107 set
108 {
109 this.Text = (string)value;
110 }
111 }
112
113 //セルスタイルを編集コントロールに適用する
114 //編集コントロールの前景色、背景色、フォントなどをセルスタイルに合わせる
115 public void ApplyCellStyleToEditingControl(DataGridViewCellStyle dataGridViewCellStyle)
116 {
117 this.Font = dataGridViewCellStyle.Font;
118 this.ForeColor = dataGridViewCellStyle.ForeColor;
119 this.BackColor = dataGridViewCellStyle.BackColor;
120
121 switch (dataGridViewCellStyle.Alignment)
122 {
123 case DataGridViewContentAlignment.BottomCenter:
124 case DataGridViewContentAlignment.MiddleCenter:
125 case DataGridViewContentAlignment.TopCenter:
126 this.TextAlign = HorizontalAlignment.Center;
127 break;
128 case DataGridViewContentAlignment.BottomRight:
129 case DataGridViewContentAlignment.MiddleRight:
130 case DataGridViewContentAlignment.TopRight:
131 this.TextAlign = HorizontalAlignment.Right;
132 break;
133 default:
134 this.TextAlign = HorizontalAlignment.Left;
135 break;
136 }
137 }
138
139 //編集するセルがあるDataGridView
140 public DataGridView EditingControlDataGridView { get; set; }
141
142 //編集している行のインデックス
143 public int EditingControlRowIndex { get; set; }
144
145 //値が変更されたかどうか
146 //編集コントロールの値とセルの値が違うかどうか
147 public bool EditingControlValueChanged { get; set; }
148
149 //指定されたキーをDataGridViewが処理するか、編集コントロールが処理するか
150 //Trueを返すと、編集コントロールが処理する
151 //dataGridViewWantsInputKeyがTrueの時は、DataGridViewが処理できる
152 public bool EditingControlWantsInputKey(Keys keyData, bool dataGridViewWantsInputKey)
153 {
154 //Keys.Left、Right、Home、Endの時は、Trueを返す
155 //このようにしないと、これらのキーで別のセルにフォーカスが移ってしまう
156 switch (keyData & Keys.KeyCode)
157 {
158 case Keys.Right:
159 case Keys.End:
160 case Keys.Left:
161 case Keys.Home:
162 return true;
163 default:
164 return !dataGridViewWantsInputKey;
165 }
166 }
167
168 //マウスカーソルがEditingPanel上にあるときのカーソルを指定する
169 public Cursor EditingPanelCursor
170 {
171 get
172 {
173 return base.Cursor;
174 }
175 }
176
177 //コントロールで編集する準備をする
178 //テキストを選択状態にしたり、挿入ポインタを末尾にしたりする
179 public void PrepareEditingControlForEdit(bool selectAll)
180 {
181 if (selectAll)
182 {
183 //選択状態にする
184 this.SelectAll();
185 }
186 else
187 {
188 //挿入ポインタを末尾にする
189 this.SelectionStart = this.TextLength;
190 }
191 }
192
193 //値が変更した時に、セルの位置を変更するかどうか
194 //値が変更された時に編集コントロールの大きさが変更される時はTrue
195 public bool RepositionEditingControlOnValueChange
196 {
197 get
198 {
199 return false;
200 }
201 }
202
203 #endregion
204
205 //値が変更された時
206 protected override void OnTextChanged(EventArgs e)
207 {
208 base.OnTextChanged(e);
209 //値が変更されたことをDataGridViewに通知する
210 EditingControlValueChanged = true;
211 EditingControlDataGridView.NotifyCurrentCellDirty(true);
212 }
213
214 }
215}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/14 00:35
2018/07/14 10:10
2018/07/17 05:56
2018/07/23 03:04