【解決方法】datagridview でイベントが 2 回呼び出されるエラー

プログラミングQA

[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]

コメント

タイトルとURLをコピーしました