[ad_1]
自分のプロジェクト用にcustomDataGridViewを開発しました。 次のように宣言されています。
C#
public partial class CustomControl1 : DataGridView { public CustomControl1() { this.KeyDown += new KeyEventHandler(CustomDataGridView_KeyDown); InitializeComponent(); } protected override void OnEnter(EventArgs e) { base.OnEnter(e); this.CurrentCell = this.Rows[0].Cells[0]; this.BeginEdit(true); }
今私が使用しているフォーム。
C#
public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { customControl11.Focus(); } private void customControl11_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { if (customControl11.CurrentCell.ColumnIndex == 0) { TextBox textBox = e.Control as TextBox; if (textBox != null) { textBox.TextChanged += TextBox_TextChanged; textBox.KeyDown += TextBox_KeyDown; textBox.Enter += TextBox_Enter; } } }
問題は、デバッガーを実行すると、OnEnter のコードが 2 回実行されていることが判明したことです。 つまり、コードは OnEnter メソッドから始まり、次に EditingControlShowing に進み、その後 OnEnter メソッドが再度実行されるということです。 その背後にあるロジックが理解できません。 尊敬するメンバーが私の間違いを発見した場合は、それを止める方法を提案してください。
私が試したこと:
if (customControl11.CurrentCell.ColumnIndex == 0) // Assuming the first column has an index of 0 { TextBox textBox = e.Control as TextBox; if (textBox != null) { textBox.TextChanged -= TextBox_TextChanged; // Attach TextChanged event handler textBox.KeyDown -= TextBox_KeyDown; // Attach KeyDown event handler textBox.Enter -= TextBox_Enter; textBox.TextChanged += TextBox_TextChanged; // Attach TextChanged event handler textBox.KeyDown += TextBox_KeyDown; // Attach KeyDown event handler textBox.Enter += TextBox_Enter;
C#
解決策 1
これは BeginEdit 呼び出しです。コントロール全体ではなく現在編集可能なセルがフォーカスを取得するため、2 回目の OnEnter が発生します。OnEnter をトリガーするのは SetFocus だと思います。
それを防ぐことはできますか? 私はそうは思いません。BeginEdit が実際に行うことを考えると、それはある程度理にかなっていますが、それを確認するには、DGV の崇拝ソースをくまなく調べる必要があります。 参照元[^]
警告: これはモノリシック ファイルです。コードは約 30,000 行あります。
[ad_2]
コメント