0

編集を許可する DataGridView があります (ReadOnly = false)。DataGridView には、そのデータソースに関連付けられた 1 つ以上のフィルターも含まれる場合があります。例えば:

(myDataGridView.DataSource as DataTable).DefaultView.RowFilter = "[myColumn] = 'value'";

フィルターが適用され、ユーザーが myColumn のフィールドを編集すると、行はフィルターの基準を満たさなくなるため、すぐに「消えます」。このアクションを抑制またはキャンセルする方法はありますか? 理想的には、フィルターが自由に再適用されるように、ユーザーがグリッドを「更新」することを望みます。

4

2 に答える 2

0

単にRowFilterいくつかのメソッドに設定しRefresh、その時点でそのメソッドのみを呼び出すことができます。ただし、イベント ハンドラーなどの適切なイベント ハンドラーにor条件を追加して、ユーザーが入力した値に関係なく現在の行が消えないようにする必要があります。RowFilterCellEndEdit

string baseFilter = "[myColumn] = 'value'";
//CellEndEdit event handler for your myDataGridView
private void myDataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e){
    (myDataGridView.DataSource as DataTable).DefaultView.RowFilter = baseFilter + " OR [myColumn] = '" + myDataGridView[e.ColumnIndex,e.RowIndex].Value + "'";
}
//you can call this method such as in some Click event handler of some Refresh Button
public void RefreshGrid(){
  (myDataGridView.DataSource as DataTable).DefaultView.RowFilter = baseFilter;
}
于 2013-10-01T06:10:39.317 に答える
0

「キングキング」が述べた方法は、その列に同様の値を持つ他のすべての行も表示するため、あまり良くありません。

自動フィルター メカニズムの使用を回避し DataTable.DefaultView.RowFilter、代わりに DataGridView のすべての行をループして、filteringcriteria をチェックして各行のVisibleプロパティを設定するオプションがあります。

    void applyFilter()
    {
        foreach (DataGridViewRow row in grid1.Rows)
        {
            string columnA = row.Cells["ColumnA"].Value as string;
            string columnB = row.Cells["ColumnB"].Value as string;
            row.Visible = (columnA == "valueA" && columnB == "valueB");
        }
    }

as: のようなものを使用して、 「含む」基準 ( as など)columnA.IndexOf("valueA", StringComparison.OrdinalIgnoreCase) > -1で検索することもできます。RowFilter = '%valueA%'

于 2013-10-09T06:01:30.257 に答える