0

データ グリッド ビューを使用して、1000 行と 800 列のデータ (セルごとに 1 文字のみ) を表示しています。チェックボックス列もあります。「選択したセルを表示」などのコンテキスト メニュー項目を追加しました。それをクリックすると、チェックされた行のみを表示しようとしています。その前にVisible、チェックされていない行のプロパティを、Falseそれぞれをループしてに設定していました。これにはとても時間がかかります。

DataViewということで、適用してControlを使ってみましたRowFilter。いくらか速く見えますが。ただし、チェックされた行の一部は表示されません。

たとえば、10 行ある場合、そのうち 5 行がチェックされます。その後、4 行のみが表示されます。実際には、チェックされている 5 つの行が表示されるはずです。

私はこれらのことを試しました

  1. dView.RowFilter="CheckBoxCol";
  2. dView.RowFilter="CheckBoxCol=true";

これらの両方で、同じ問題が発生しています。誰でもこれについて私を助けることができますか?

4

2 に答える 2

0

あなたが示した両方の方法はRowFilter、ブール値の列として機能します。

ハンドルの編集方法に問題がある可能性が最も高いです。DataGridView現在の編集セルがフォーカスを失うまで、基になるデータ ソースにコミットされません。また、グリッドにコンテキスト メニューを表示する最も一般的な方法では、セルはフォーカスを失いません。

つまり、コンテキスト メニューを次のように表示すると、次のようになります。

void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {            
        contextMenuStrip1.Show(dataGridView1, e.Location);
    }
}

次に、変更した最新のチェック ボックスは、その変更をデータ ビューにフラッシュしていません。

これに対する解決策は 2 つの部分にあります。まず、データ ビューとデータグリッドの間にあるバインディング ソースを導入する必要があります。

bindingSource1.DataSource = dView;
dataGridView1.DataSource = bindingSource1;

次に、次のコードをデータ グリッド ビューの 'CurrentCellDirtyStateChanged' ハンドラーに追加する必要があります。

void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    if (dataGridView1.IsCurrentCellDirty)
    {
        dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
}

EndEdit最後に、フィルターを適用するコード内で、バインディング ソースも呼び出す必要があります。

private void filterToolStripMenuItem_Click(object sender, EventArgs e)
{
    bs.EndEdit();
    dvSections.RowFilter = "CheckBoxCol";
}

私の以前の経験ではバインディング ソースは必要ありませんでしたが、コンテキスト メニューとデータ ビューをこのように組み合わせて試したことはありませんbs.EndEdit()でした。

于 2012-08-22T21:34:56.037 に答える
0

デビッド・ホールは正しいと思います(コメントするだけの十分なポイントがなく申し訳ありません-これが私がここでやろうとしていることです)

可能であれば、データ グリッド ビューの基になるソース テーブルで Table.AcceptChanges を試してください。

これにより、残存する変更がテーブルにコミットされ、続いて DGV にコミットされます。

于 2014-09-11T11:40:13.213 に答える