DataGridViewは、行の選択を禁止します(行状態変更イベント)C#



Datagridview Prohibits Row Be Selected C



今日、winformテーブル(DataGridView)の一部の行を選択してはならないという要件に遭遇しました。次の図に示すように、デフォルトですべての行を選択できます。





テーブル内の行は、さまざまな方法で選択できます。たとえば、行をクリックして選択し、Ctrlキー、Shiftキー、その他のショートカットキーを使用して選択し、左上隅をクリックしてすべてを選択します。



解決策は、コントロールのイベントを通じてそれを行うことです。常識によれば、行を選択または選択解除すると、選択されたイベントまたは選択されていないイベントが確実にトリガーされます。理論的には、このイベントでは、選択した属性をfalseに設定できます。

しかし、これらの動的にロードされた行について、選択したイベントを定義する方法は?

答えは、行を直接操作することはできませんが、テーブル全体で操作する必要がある、つまり、DataGridViewのイベントを定義する必要があるということです。



アイデア:

テーブルのRowStateChangedイベントに処理メソッドを追加します。行が変更される限り(表示、非表示、選択、選択解除など)、イベントが1回トリガーされることが測定されます。次の図に示すように、テーブルがロードされると、イベントは行の数だけトリガーされます。



RowStateChangeイベントでは、行への参照を含むパラメーターDataGridViewRowStateChangedEventArgsに付属するイベントハンドラーDataGridViewRowStateChangedEventHandlerとも連携する必要があります。


あまりナンセンスではありません、コード:

dgv.RowStateChanged += new DataGridViewRowStateChangedEventHandler(handleRowState) //... /// /// Processing when row is selected /// private void handleRowState(Object sender, DataGridViewRowStateChangedEventArgs e) { Console.WriteLine('RowStateChanged:' + e.Row.Cells[1].Value) if (e.Row.Cells[10].Value.Equals('not uploaded')) { e.Row.Selected = false } }

問題が解決しました!


RowStateChangeイベントに関する補足:

行Aが現在選択されており、この時点で行Bがクリックされているとします。行Aがオフになっていて、行Bが選択されていることがわかります。 RowStateChangeイベントは、実際には2回トリガーされます。つまり、行Aが失われ、行Bが選択されます。