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

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

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

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

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

Windows Forms

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

Q&A

解決済

3回答

10364閲覧

WinFormsのDataGridViewでCellValidatedイベント発生後のフォーカス

shun_kuwa

総合スコア187

C#

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

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

Windows Forms

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

0グッド

0クリップ

投稿2018/11/02 08:51

実現したいこと

DataGridViewのCellValidatedイベント発生後、検証エラーなら該当セル(直前まで編集していたセル)にフォーカスが残ったままの状態にしたいです。

試したこと

以下のソースで実現可能と思ったのですが、想定通りになりませんでした。
具体的には、検証エラーは発生するもののフォーカスは別のセルへ移ってしまいました。

C#

1private void dataGridView_CellValidated(object sender, DataGridViewCellEventArgs e) 2{ 3 // 何らかの自作検証処理 4 if(xxx == string.Empty) 5 { 6 MessageBox.Show("エラーメッセージ", "タイトル"); 7 this.dataGridView.Rows[e.RowIndex].Selected = true; // ←これで該当セルを選択できるものと思っていました。 8 } 9}

かなり初歩的な質問で申し訳ないですが、知恵を貸していただけると幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

こちらを参考にすると良いですよ
DataGridViewのセルに入力された値が正しいか確かめる

投稿2018/11/02 09:35

編集2018/11/02 09:37
seesaajira-

総合スコア107

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

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

shun_kuwa

2018/11/02 09:52

ありがとうございます。 今まで見たことが無いやり方だったので勉強になりました。 今回はCellValidatingイベントで目的が達成できそうですが、なにかのときに参考にさせてもらいます。ありがとうございました。
guest

0

ベストアンサー

検証を行うのはCellValidatedイベントではなくCellValidatingイベントを使用してください。
CellValidatedイベントは検証後に発生するイベントです。

投稿2018/11/02 09:00

YAmaGNZ

総合スコア10222

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

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

shun_kuwa

2018/11/02 09:41 編集

CellValidatingイベントの使用も検討し、一度は実装してみたのですが、セルからフォーカスが離れたタイミングでは処理が走らなくなったように見えました。 おそらく、CellValidatingイベント中ではまだ検証対象となる文字列がCellのValueプロパティに設定されていないのでは?と思ってたのですが、別の原因だったんですかね。 人が書いたソースの修正を行っており、もともとすべての検証処理がCellValidated内に書かれていましたので、ひょっとしたら既存ソースが何か悪影響与えているのかもしれません。
guest

0

CurrentCell を指定してみてください。

投稿2018/11/02 08:58

Zuishin

総合スコア28656

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

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

shun_kuwa

2018/11/02 09:33 編集

以下の通り書き換えてみましたが、現象変わらずでした。 e に渡ってきているインデックス情報が、既に新しく選択したセルのものになっているのでしょうか。 this.dataGridView.CurrentCell = this.dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex];
Zuishin

2018/11/02 09:40

逆に、CurrentCell を指定した後に移動が発生しているのかもしれません。 YAmaGNZ さんのおっしゃるように CellValidating でキャンセルするのがいいかもしれません。 確認できる状況になったらしてみますが、それで解決しそうな気もします。
shun_kuwa

2018/11/02 09:50

Cellがコンボボックスになっているのですが、デバッグしてみたところCellValidating内ではまだ変更前の値となっていました。代わりにe.FormattedValueに変更後の値が入るみたいですね。 e.FormattedValueとe.Cancelを併用することで目的を達成できそうでした。 助かりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問