質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

3324閲覧

DataGridViewのカラムにプロパティ追加

seesaajira-

総合スコア107

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2018/07/13 09:42

VS2017 C#にてWindows Form アプリを制作しています。
DataGridViewでカラムが数値の場合、数値以外入力できないようにガードをかけようと思っています。

カスタムコントロールを作成し、カラムの列の編集画面にプロパティを設定するところまではできました。
(ColumnTypeでDataGridViewTextBoxColumnEXを選択する事で数値入力プロパティを表示)
![イメージ説明]

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace CustomDBGrid { #region カラムプロパティ追加 public partial class DataGridViewTextBoxColumnEX : DataGridViewTextBoxColumn { #region "プロパティ public Boolean 数値入力 { get; set; } #endregion public override object Clone() { DataGridViewTextBoxColumnEX dataGridViewCell = base.Clone() as DataGridViewTextBoxColumnEX; if (dataGridViewCell != null) { dataGridViewCell.数値入力 = this.数値入力; } return dataGridViewCell; } } #endregion public partial class DataGridViewEX : DataGridView { /// <summary> /// 数値入力チェック /// </summary> /// <param name="e"></param> protected override void OnCellValidating(DataGridViewCellValidatingEventArgs e) { if (this.Columns[e.ColumnIndex].数値入力)//<-このような処理をしたい { 数値入力チェックの処理; } }

そのプロパティがTrueの場合、数値チェックとしたいのですが、コードからプロパティを参照する事ができません。

どのようにすれば実現可能でしょうか?

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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/13 12:09

編集2018/07/14 10:15
YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

seesaajira-

2018/07/14 00:35

YAmaGNZさん、早速の回答ありがとうございます。 頂いたヒントを参考に、ググってみます❗
YAmaGNZ

2018/07/14 10:10

現状、DataGridViewEX側で入力チェックを行うように作成しようとされているように思えます。 わざわざDataGridViewColumnを拡張するのであれば、入力用のコントロール、DataGridViewCellを拡張するのが筋なのかなと思います。
seesaajira-

2018/07/17 05:56

YAmaGNZさん、さらに詳細なソースありがとうございます。 C#初心者で解析に時間かかってますので、もうしばらくお待ちください。
seesaajira-

2018/07/23 03:04

遅くなって申し訳ございませんでした。 //CellTemplateとするDataGridViewMaskedTextBoxCellオブジェクトを指定して基本クラスのコンストラクタを呼び出す public DataGridViewTextBoxColumnEX() : base(new DataGridViewTextBoxCellEX()) { } で引っかかってしまって、時間がかかってしまいました。 エラー 「DataGridViewTextBoxColumnには、引数1を指定するコンストラクタは含まれていません」 となってしまったので、 public DataGridViewTextBoxColumnEX() { this.CellTemplate = new DataGridViewTextBoxCellEX(); } としたところ、うまくいきました。 後は、OnTextChangedで数値チェックの処理を追加するだけです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問