6

私は ListView を持っていて、ループで 1 つずつアイテムを追加します。
この ListView には CheckBoxes があります

そのループで、チェックボックスをオンにするかどうかを決定します
問題は、チェックボックスをオンにする必要があるチェックボックスが多すぎる場合、アイテムの追加が遅すぎる場合
です。コードは次のとおりです。

for (int i = 0; i < dt.Rows.Count; i++)
{
    DataRow drow = dt.Rows[i];

    // Only row that have not been deleted
    if (drow.RowState != DataRowState.Deleted && int.Parse(drow["season"].ToString()) != 0)
    {
        ListViewItem lvi = new ListViewItem(drow["episode_name"].ToString());

        lvi.SubItems.Add(drow["first_aired"].ToString());
        lvi.SubItems.Add(drow["episode"].ToString());
        lvi.SubItems.Add(drow["season"].ToString());
        lvi.SubItems.Add(drow["rating"].ToString());
        lvi.SubItems.Add(drow["episode_id"].ToString());
        if (bool.Parse(drow["watched"].ToString()))
        {
            lvi.Checked = true; //this is the problem, when i remove it, adding is fast
        }
        else {
            lvi.Checked = false;
        }
        episodesList.Items.Add(lvi);
    }
}

どうすれば速くなりますか?

4

3 に答える 3

9

.BeginUpdate()リストビューで、結果を読み込んでいる間に呼び出します。終了後、お電話.EndUpdate()ください。処理と描画を同時に試行しないため、これにより速度が向上するはずです。

// wait to draw
episodesList.BeginUpdate();

// add your items

// draw everything
episodesList.EndUpdate();

編集

ジャスティンが示唆したように、 AddRange() はいくつかの助けになる可能性がありますが、おそらく問題を解決することはできません. 参照: ListView へのアイテムの追加を高速化するには?

編集#2

イベント ハンドラーが問題の原因であるため、ロード中にハンドラーを削除し、後で再度追加することで回避できます。_isLoadingまたは、ロードの前後に設定したグローバルブール値を使用_isLoadingして、ハンドラーをチェックインして、Db に移動しないようにすることもできます。ただし、ハンドラーの削除/読み取りは、おそらくよりクリーンなソリューションです。

イベント ハンドラーの削除

于 2013-05-02T17:11:57.933 に答える
0

文字列インデクサーのルックアップが原因で、速度が低下している可能性があります。インデックスが静的であることを期待できますか? コードを整数インデックスに置き換えてみて、パフォーマンスが向上するかどうかを確認してください。

于 2013-05-02T18:11:21.770 に答える