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

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

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

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

C#

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

1回答

9672閲覧

DataGridViewの列ごとに入力制限をかけたいが、新規行の入力制限がうまくいかない。

_doll_

総合スコア22

DataGrid

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

C#

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

1クリップ

投稿2020/03/03 15:54

前提・実現したいこと

実現したいこと

  • DataGridViewの列ごとに入力制限をかけたい。
  • 現在は新規行の編集時に入力制限が期待通りに動かない。

前提

  • DBから取得したレコードをListからDataTable型に変換し、DataSourceにバインド
  • コンボボックスでテーブル名を選択すると、選択したテーブルのレコード一覧を表示する
  • 主キーの値は編集不可、新規行のときは入力可能
  • データを変更、追加後更新ボタンを押すことでDBのレコードを更新、追加を行う
  • int型には数字のみ、decimal型は数字と小数点1つを入力可能とする
  • 入力できない文字は入力を受け付けない
  • テーブルは以下のイメージ

Table1

列1(主キー)列2列3
intdecimaldecimal

Table2

列1(主キー)列2列3
Stringintdecimal

Table3

列1(主キー)列2列3
decimalintString

発生している問題・エラーメッセージ

新規行に入力する際に入力制限がうまくいかない

該当のソースコード

現在手元にソースコードがないため大まかなものになります

c#

1private void dataGridView1_EditingControlShowing(object sender, 2 DataGridViewEditingControlShowingEventArgs e) 3{ 4 DataGridView dgv = (DataGridView)sender; 5 6 //編集のために表示されているコントロールを取得 7 DataGridViewTextBoxEditingControl tb = 8 (DataGridViewTextBoxEditingControl)e.Control; 9 10 //イベントハンドラを削除 11 tb.KeyPress -= 12 new KeyPressEventHandler(dataGridViewTextBox_KeyPress); 13 14 15 if (コンボボックスのテキストが"Table1"の時) 16 { 17 //KeyPressイベントハンドラを追加 18 tb.KeyPress += 19 new KeyPressEventHandler(dataGridViewTextBox_KeyPress); 20 } 21 22 if (コンボボックスのテキストが"Table2"の時) 23 { 24 if(2、列3の時) 25 { 26 //KeyPressイベントハンドラを追加 27 tb.KeyPress += 28 new KeyPressEventHandler(dataGridViewTextBox_KeyPress); 29 } 30 } 31 32 if (コンボボックスのテキストが"Table3"の時) 33 { 34 if(1、列2の時) 35 { 36 //KeyPressイベントハンドラを追加 37 tb.KeyPress += 38 new KeyPressEventHandler(dataGridViewTextBox_KeyPress); 39 } 40 } 41} 42 43//DataGridViewに表示されているテキストボックスのKeyPressイベントハンドラ 44private void textBox1_KeyPress( object sender, KeyPressEventArgs e ) { 45 // 制御文字は入力可 46 if ( char.IsControl(e.KeyChar) ) { 47 e.Handled = false; 48 return; 49 } 50 51 // 数字(0-9)は入力可 52 if ( char.IsDigit(e.KeyChar) ) { 53 e.Handled = false; 54 return; 55 } 56 if(現在のセルのタイプがdecimalだった場合){ 57 // 小数点は1つだけ入力可 58 if ( e.KeyChar == '.') { 59 TextBox target = sender as TextBox; 60 if ( target.Text.IndexOf('.') < 0 ) { 61 // 複数のピリオド入力はNG 62 e.Handled = false; 63 return; 64 } 65 } 66 } 67 68 // 上記以外は入力不可 69 e.Handled = true; 70} 71

試したこと

記載したコードだと、更新(変更)の際の入力制限は期待どおりですが
新規行の時に、数字のみしか入力ができません。
新規行のタイプがすべてInt32となっていました。

補足情報(FW/ツールのバージョンなど)

.NetFrameWork4.8
SQLServer 2017
VisualStudio

初心者で間違いや不足等あると思います。
追記すべきこと等ありましたら教えていただきたく思います。
よろしくお願いいたします。

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

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

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

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

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

YAmaGNZ

2020/03/04 04:14

現在のセルのタイプがdecimalだった場合というのはどのように判断しているのですか?
_doll_

2020/03/04 04:19

DataGridView.CurrentCell.ColumnIndex.GetType().Equals(typepf(decimal)); で判断しております。
YAmaGNZ

2020/03/04 05:24

それだとColumnIndexの型との比較になりませんか?
_doll_

2020/03/04 06:03

ご指摘の通りですね・・・ Int32にしかならないのは当然ですね・・・ ご指摘ありがとうございます。
guest

回答1

0

自己解決

判定条件を、「現在のセルのタイプがdecimalだった場合」ではなく、カラムインデックスで判定するように変更しました。

投稿2022/08/24 07:08

_doll_

総合スコア22

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問