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フォームアプリケーション
回答2件
あなたの回答
tips
プレビュー