2017-01-12 14 views
0

Datagridviewをデータテーブルにバインドしました。私はセルの値に応じて行を非表示にするか、たとえばセルの値が "N"の場合は行を表示し、それ以外の場合は "Y"の行を非表示にします。データソースの変更時にDatagridviewを更新する

のDataColumnのようにセットアップです:私はまた、以下のようにするDataGridViewのCellValueChangedイベントを処理している

New DataColumn With {.ColumnName = "Rec", .AllowDBNull = False, .DefaultValue = "N", .DataType = GetType(String)} 

Private Sub DataGridView1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged 
    If CType(sender, DataGridView).Columns(e.ColumnIndex).HeaderText.Equals("Rec") Then 
     CType(sender, DataGridView).Rows(e.RowIndex).Visible = CType(sender, DataGridView).Item(e.ColumnIndex, e.RowIndex).Value.Equals("N") 
    End If 
End Sub 

しかし、私は、プログラム( "Y" に値を変更したときと値がグリッドで変更されているのがわかります)、行はまだ表示されています。私もイベントハンドラの中に休憩を入れ、それは解雇されません!だから質問、私は "Y"にセルの値を変更すると、datagridviewrowを非表示にするのですか?

EDIT

ただ、当面の問題にいくつかのより多くの明快さを追加するには、これは私がプログラムでグリッドのデータソースを更新する方法である:

CType(DataGridView1.DataSource, DataTable).Item("Rec") = "Y" 

私が直接グリッドを更新するため、発射できますセルの値が更新されるたびに、バインディングを中断してからグリッドへのバインディングを再開しなければならない場合は、Cellvaluechangedイベントが発生し、CurrencyManagerエラーがスローされます。これは小さなデータセットでさえ、カタツムリのペースで機能します(リフレクションによって実装されたダブルバッファリングでさえ)。

+0

「DataTable」から行を削除します。 – Fabio

+0

データテーブルから行を削除すると、その行を更新してdatagridviewで再び表示できるようになりません。 – Nepaluz

+0

DataGridviewで行を非表示にすると、セルの値を 'N'に戻すことができますか? – Fabio

答えて

1

DataTableに直接バインドするのではなく、DataTableをBindingSource(コントロール)にバインドし、グリッドにバインドしてみてください。次に、BindingSource内のイベントを使用して、グリッド内の変更やプログラムによる変更を直接データテーブルに変更したときを確認できます。

また、DataTableによって発生したイベントがあり、データがいつ変更されたかを判断できます。

0

あなたが好き、アップグレードされた細胞から、あなたがしてセルを非表示次の段階でいくつかのことをrowIndexプロパティを抽出cellvalue更新OK:私はこれをしなかったテストのためにそう

DataGridView1.Rows.Item(rowindex).Visible = False 

を:

DataGridView1(1, 2).Value = "Y" 
DataGridView1.Rows.Item(2).Visible = False 

と動作します。

+0

はい、元の質問(と編集)を見ると、コントロールの直接更新は機能しますが、バインディングなどを一時停止する必要があるのは非常に遅いのですが、データテーブルの更新は非常に高速ですが、行はトグルされません。 – Nepaluz

0

私が直面していた問題は、私がやってみたよりも少し複雑だったように、@ John0987の提案を部分的に使って解決しました。基本的には、フォームワイドブール変数をfalseに初期化し、ブール値をtrueに設定したDataGridViewのDataBindingCompleteイベントを処理し、行を非表示にする前にCellValueChangedイベントにBooleanチェックを追加したハックです。これまでのところ、完璧に動作します。

関連する問題