2012-02-03 1 views
2

私はこの問題を解決しようとしてきましたが、.NETフレームワークの問題であるようです。とにかく、私は5000以上のアイテムと、リストビュー内の選択されたアイテムをさらに処理するためのボタンを含むリストビューを持っています。このボタンをクリックすると、リストビューの "listview.HeaderStyle"プロパティを "ColumnHeaderStyle.Nonclickable"に設定する必要があります。 今私はそれを行う。プログラムは10秒間停止してから作業を続けます。何が起きているのか、なぜこれが起きているのか分かりません。私は皆さんにこれについての解決策があることを願っています。 アイデア?ListViewのHeaderStyleを変更するとアプリケーションが停止するのはなぜですか?

+1

これが数秒遅れてしまうのは特に驚きではありません。おそらくフレームワークは、プロパティを設定するたびにネイティブのListViewコントロールを再作成します。 ListViewには5000以上のアイテムがたくさんあることに注目してください... –

+0

解決策はありますか? – SolidSnake

答えて

1

私は今の基本的な解決策を見つけた、私が必要とするすべては、今はもう「listview.HeaderStyle」プロパティを変更する必要はありません

myListview.ColumnClick += new ColumnClickEventHandler(delegate{});

を設定することです。 基本的にHeaderStyleプロパティからColumnClickイベントを無効にしていました。 HeaderStyleをnonClickableに設定するのではなく、イベントハンドラ内の関数を削除/変更するだけです。

0

BackgroundWorkerMSDNを使用してこの問題を解決できます。

:このソリューションを使用しても、しばらくフォームがハングします。 はUIスレッドをブロックするため、リストにバインドされるアイテムが5000以上あるため、winformがハングします。しかしlistview.HeaderStyleは変更されます。

は、あなたが直接ColumnHeaderStyle.Nonclickablelistview.HeaderStyleのpropertを変更するには、ボタンをクリックしたときに、この

  1. 試してみてください。次に、RunWorkerAsyncBackgroundWorkerと呼んでください。
  2. DoWorkイベントハンドラでは、処理を行い、一度データをリストビューにバインドします。これを行うには、プロジェクトに次の拡張クラスを追加する必要があります。

拡張クラス

public static class ControlExtensions 
{ 
    public static void Invoke(this Control control, Action action) 
    { 
     if (control.InvokeRequired) control.Invoke(new MethodInvoker(action), null); 
     else action.Invoke(); 
    } 
} 

あなたはこれがあなたのために働く

listview.Invoke(() => (listview.DataSource = dataSource; }); 

希望をListViewのためにデータをバインドすることができ、これを使用します。

+0

考えてくれてありがとう..しかし、実際にはそれほど違いはありません。私はちょうど何かをブロックしない別の簡単な解決策を考えました...そのColumnclickイベントを空の関数に変更しました。 – SolidSnake

+1

これは、バックグラウンドスレッドですべての計算を行い、UIスレッドを自由に保つという考えです。 UIスレッドはレンダリング部分のみを処理し、理想的には計算を処理しません。 –

関連する問題