2011-10-03 20 views
7

私はチェックボックスの列を持つDataGridViewを持っています。私はすべての選択/選択解除ボタンを作成しようとしています。値を変更するためのコードは簡単ですが、パフォーマンスは恐ろしいものです。DataGridViewチェックボックスの列「すべてを選択」のパフォーマンス

for (int i = 0; i < dgv.RowCount; i++) 
{ 
    dgv.Rows[i].Cells["Selected"].Value = _selectAll; 
} 

_selectAllは、単にトグルブール変数です。パフォーマンスが速い場所でこれを行うより良い方法はありますか?私は基礎となるDataTableの値を変更しようとしました。わずか数百行で数秒かかりますが、ほとんどの作業は何千行も行なわれます。

& EDIT溶液(2011年10月4日)

主な問題は、DGV特性でした。設定したら、

dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; 

パフォーマンスが大幅に改善されました(MSDN DataGridView Performance)。 この編集時点で提案されている解決策も、パフォーマンスを少し向上させます。

+1

名前ではなくインデックスで列にアクセスしてみてください。例えば'dgv.Rows [i] .Cells [1] .Value = _selectAll;' –

+0

グリッドはどのプロパティにも束縛されているのでしょうか? –

+1

ボトルネックはどこにあるのですか?私はそれが他の場所だと思っています。 –

答えて

6

おかげでたくさん、...、性能がはるかに優れて

dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; 

0

わからないあなたが試すことができ、パフォーマンスの向上やないが、他の何か買ってあげる場合:GridViewの列名を与えるの

for (int i = 0; i < dgv.RowCount; i++) 
{ 
    dgv["Selected", i].Value = _selectAll; 
} 
0

を代わりに、uが、それはto.Thisをします属している列を指定することができますより速く動作します。それが役に立てば幸い。

for (int i = 0; i < dgv.RowCount; i++) 
{ 
    dgv.Rows[i].Cells[4].Value = _selectAll; 
} 
1

これはよくある問題です。
まず、チェックボックスのチェックの変更に関連する処理はありますか?
その場合は、boolメンバー変数を作成します。
[すべて選択/すべて選択解除]を実行する前に、falseに初期化します。
チェックボックスでチェックされた変更イベント - >ブールパラメータの値を確認します。
イベントからの誤った戻りがある場合。何も処理しないでください。
forループを完了してselect all/Deselect allを設定した後、必要に応じてチェックされた変更イベントを処理します。
forループの後にboolパラメータをtrueにリセットするのを忘れないでください。

bool _allowProcessing = false; 
//SelectAll/Deselect All 
for (int i = 0; i < dgv.RowCount; i++) 
{ 
    dgv.Rows[i].Cells[4].Value = _selectAll; 
} 
_allowProcessing = true; 
// Do some processing if required 

// Checked change event 
public void CheckBox_CheckedChange(object sender, eventArgs e) 
{ 
    if(!_allowProcessing) 
    return; 

    // Do Processing 
} 
+0

これは示唆されたものの最も完全な解決策であるようです。パフォーマンスが悪い主な理由に対処する私の質問の編集に注意してください。 – Handprint

0

AutoSizeColumnsModeプロパティを設定することで、私はこの問題を改善するための別の方法を示しています。
dgv.Rows[i].Cells["Selected"].Valueのように直接datagridviewにアクセスすると、datagridviewがゆっくりと作成されます。

したがって、datagridviewにdatasourceがあり、datasouceがstatusをチェックしている場合、datasourceを変更してdatagridviewを更新すると、パフォーマンスが向上します。

foreach (var item in yourDataSource) 
{ 
    item.Checked = _selectAll; 
} 
dgv.Invalidate(); 
関連する問題