0

データテーブルにバインドされた Datagridview があります。たとえば、セルの値が「N」の場合は行を表示し、「Y」の場合は行を非表示にします。

データ列は次のように設定されています。

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

以下のように Datagridview の CellValueChanged イベントも処理しました。

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」に変更したときにデータグリッドビュー行を非表示にするにはどうすればよいですか?

編集

当面の問題をより明確にするために、これはグリッドのデータソースをプログラムで更新する方法です。

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

グリッドを直接更新して cellvaluechanged イベントを発生させることができますが、これにより CurrencyManager エラーがスローされるため、セル値が更新されるたびにバインドを一時停止してからグリッドへのバインドを再開する必要があります。それは機能しますが、小さなデータセットでもカタツムリのペースで動作します (リフレクションを介して実装されたダブル バッファリングを使用しても)。

4

3 に答える 3

0

セル値を更新すると、アップグレードされたセルからrowindexを抽出し、次のステップでセルを非表示にします。次のようなものです。

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

だから、テストのために私はこれをしました:

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

そしてそれは動作します。

于 2017-01-12T16:21:18.213 に答える
0

私が直面していた問題は、私が許したよりも少し複雑だったようです。基本的には、フォーム全体のブール変数を false に初期化し、ブール値を true に設定する DataGridView の DataBindingComplete イベントを処理し、行を非表示にする前に CellValueChanged イベントにブール値チェックを追加するハックです。これは、これまでのところ問題なく動作します。

于 2017-01-25T11:27:52.607 に答える