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

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

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

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

Visual Studio

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

Q&A

解決済

2回答

7185閲覧

DataGridViewで別コントロールへ移動したらCancelEdit()したい。

orbwedu4

総合スコア13

C#

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

Visual Studio

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

0グッド

0クリップ

投稿2018/11/27 04:21

Form1のDataGridViewのセルを編集中にフォーカスが移動した場合、
(間違って他のコントロールをクリックしたとか)念のため、セルの値が
元に戻るようにしたいです。

以下のサイトを参考にして
https://dobon.net/vb/dotnet/datagridview/cellvalidating.html
CellValidatingイベント中にフォーカス移動を検出した場合にCancelEdit()
すればよいと思ったのですがこのフォーカスの移動がうまく検出できません。

(formにはdatagridview1,datagridview2とtabcontrol1を貼り付け
datagridview2をtabcontrol1の上にのせています。)
なにかいい方法がありましたら教えてください。

public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { var dgv1List = new List<Data>() { new Data() { A = "a",B = "b",C = "c" }, new Data() { A = "aa",B = "bb",C = "cc" }, }; var dgv2List = new List<Data>() { new Data() { A = "aaa",B = "bbb",C = "ccc" }, new Data() { A = "aaaa",B = "bbbb",C = "cccc" }, }; dataGridView1.DataSource= dgv1List; dataGridView2.DataSource= dgv2List; } private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { var dgv = (DataGridView)sender; if (e.RowIndex == dgv.NewRowIndex || !dgv.IsCurrentCellDirty) return; if (Int16.TryParse(e.FormattedValue.ToString(), out Int16 i)) { if (!dgv.Focused) dgv.CancelEdit(); //←ここで検出できてない? MessageBox.Show("int16"); } else { dgv.CancelEdit(); e.Cancel = true; MessageBox.Show("NG"); } } private void dataGridView2_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { var dgv = (DataGridView)sender; if (e.RowIndex == dgv.NewRowIndex || !dgv.IsCurrentCellDirty) return; if (Int16.TryParse(e.FormattedValue.ToString(), out Int16 i)) { if (!dgv.Focused) dgv.CancelEdit(); MessageBox.Show("int16"); } else { dgv.CancelEdit(); e.Cancel = true; MessageBox.Show("NG"); } } } public class Data { public string A { get; set; } public string B { get; set; } public string C { get; set; } }

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

Visual Studio 2017 .NET Framework 4.7.2
Windowsフォームアプリケーション

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

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

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

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

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

YAmaGNZ

2018/11/27 11:08

とりあえず提示されているコードを動かしましたが、編集時に別コントロールをクリックすると、編集がキャンセルされ、フォーカスが移動します。どのような操作をし、どう動いて、どこが思いと違う動きをしているのでしょうか?
orbwedu4

2018/11/27 12:15

すみません。いま確認してみたら編集中に別コントロールをクリックで確かにキャンセルされました。。。投稿したときはうまくいかなかったと勘違いしていたかもしれません。それとは別の想定していない動き(数字を入れてENTERを押すと値がキャンセルされる)をしているのでもう一度よく考えてから再度質問したいとおもいます。
guest

回答2

0

キー入力にて編集が終了した場合は
dgv.Focused=false
this.ActiveControl=DataGridViewTextBoxEditingControl
となっていましたので、this.ActiveControlにて判断出来るかと思います。

投稿2018/11/27 12:35

YAmaGNZ

総合スコア10242

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

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

orbwedu4

2018/11/27 12:42

回答ありがとうございます。 ActiveControlで現在アクティブなコントロールを取得できるのですね。 編集の仕方でどのようにフォーカスが移動するか確認してみます。
guest

0

自己解決

再度確認してからもう一度質問しようとおもいます。
いったん解決にしておきます。

投稿2018/11/27 12:17

orbwedu4

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問