0

特に階層グリッド、つまり「グリッド内のグリッド」機能を利用する目的で、サードパーティの DataGridView の実装を試すことにしました。これはかなりうまくいっていますが、通常の DataGridViews で依存しているイベントとプロパティの一部がこの実装には存在しないことに気付き、同じ目標を達成するために別の方法を見つける必要がありました。

そのような目標の 1 つは、CheckBoxColumn を使用し、ユーザーがボックスを「チェック」または「チェック解除」したときに、その変更が発生したときにその変更をグリッド (およびその後データベース) にプッシュする必要があることでした。 Enterキーを押すか、セルフォーカスを離れて実際に変更をコミットします....ちょっと不安定です。これを改善するために、「CurrentCellDirtyStateChanged」イベントを利用して、チェックまたはチェック解除を手動でグリッドにコミットしました。これにより、「CellValueChanged」イベントが発生しました。

void dataGridView_CurrentCellDirtyStateChanged(object  sender, EventArgs  e)
{       
     if ((dataGridView.IsCurrentCellDirty) & (dataGridView.CurrentCell.ColumnIndex == 0))
     {
          dataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
     }
}

ただし、このイベントはサードパーティ グリッドには存在せず、CommitEdit メソッドにも存在しません。同じ機能を実現するために、私はこれをしなければならなくなりました:

void GridView_ValueChanged(object sender, EventArgs  e) 
{ 

     if(sender.GetType().ToString().Contains("RadCheckBoxEditor"))
     {       
        RadCheckBoxEditor rad_chb = (RadCheckBoxEditor)sender;
        GridCheckBoxCellElement checked_a_box = (GridCheckBoxCellElement)rad_chb.OwnerElement;

        checked_a_box.Value = rad_chb.Value;

        GridViewCellEventArgs new_args = new GridViewCellEventArgs(checked_a_box.RowInfo, checked_a_box.ColumnInfo, checked_a_box.Editor);

        GridView_CellValueChanged(checked_a_box, new_args);

     }
     else
     {
         return;
     }


}

私は本質的にダーティな値をキャッチし、「CellValueChanged」ハンドラーによって認識可能な型の値に割り当て、独自のイベント引数を定義し、ハンドルを明示的に呼び出しました。このようなものに潜在的な匂いはありますか? 気分が悪いだけです。他の人が共有コードにアクセスするための独立した関数を作成することを提案していることに気付きましたが、それらの例はイベントをプッシュする特定のイベントに依存していないようでした。

4

0 に答える 0