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

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

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

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

Visual Studio

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

解決済

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

orbwedu4
orbwedu4

総合スコア13

C#

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

Visual Studio

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

2回答

0評価

0クリップ

4784閲覧

投稿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フォームアプリケーション

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

YAmaGNZ

2018/11/27 11:08

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

2018/11/27 12:15

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

Visual Studio

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