1

複数の列を持つ ListView に ListViewItems を配置するために次のパターンを採用しました(タイプのリストに関する情報を表示するMyObject場合)。これがこのタスクを達成するための最良の方法であるかどうか、またはコードでより効率的で読みやすいものがあれば:

  1. コンストラクターでオブジェクトを受け取る継承されListViewItemたクラスMyObject(私はこれを呼び出します)と、ListViewItem サブアイテムをクリアして再設定MyObjectListViewItemするメソッドを作成します。Refresh()
  2. ListView に新しい MyObjectListViewItem 項目を設定します。

例:

public MyObject MyObject { get; set; }
public MyObjectListViewItem(MyObject myObj)
{
    MyObject = myObj;
    this.Refresh();
}

public void Refresh()
{
    this.SubItems.Clear();
    this.Text = myObj.FirstColumnProperty;
    this.SubItems.Add(myObj.SecondColumnProperty); // etc...
}

提案?より良い方法は?

4

2 に答える 2

1

BindingSourceの使用、または IBindingListView を実装する独自の作成を検討しましたか? これにより、データとその状態に関する懸念がデータ自体に限定され、データを消費するコントロールに限定されなくなります。.NET コントロールは既に BindingSources で動作するように構築されているため、より堅牢な機能を利用できます。画面の更新を明示的に呼び出す代わりに、コントロールはバインディング ソースによって発生したイベントへの応答と、強制せずにコントロールを更新する準備ができているかどうかを通知するコントローラーのみを担当します。

于 2009-11-16T16:18:25.083 に答える
0

自分自身を構築する方法を知っている ListViewItems を作成することは良い考えです。

そのアイデアを少し拡張すると、各サブアイテムを構築する方法を列に認識させることができます。これにより、ListView を自動的に並べ替え、グループ化をサポートし、行をコピー/ドラッグ アンド ドロップすることもできます。これは、ObjectListViewが行うことのほんの一部です。

ObjectListView は、.NET WinForms ListView コントロールのオープン ソース ラッパーであり、ListView をより使いやすくするだけでなく、いくつかの非常に優れた新機能を追加し、いくつかの厄介なバグ/制限を回避します。

シンプルな ObjectListView の動作

を使用するという @Rex のアイデアが気に入った場合BindingSource、ObjectListView プロジェクトは、DataListViewデータ バインド可能なデータ対応も提供します。

于 2009-11-20T18:23:57.793 に答える