System.Windows.FormsのListViewで問題が発生しました。自分でそれを処理できず、助けを求めたり、どこで間違っているのかヒントを求めたりします。
説明:
-クラスがあります-標準のListViewItemを継承しますが、独自のデータ処理クラスを格納するcListViewItem(カスタムからは「c」)という名前を付けます。ここで、ListView.items.Add()を使用してcListViewItemをListViewクラスに追加した後、アイテムの名前を制御できないようです。
-私のソースの断片(この投稿の目的のためにlilが変更されました)
using System.Windows.Forms;
cListViewItem:ListViewItem
{
// gives a basic idea
public cListViewItem( myclass DataStorage )
{
// constructor only stores DataStorage to a local variable for further use;
this._storage = DataStorage;
}
protected myclass _storage;
// and there goes the fun:
// I thought that ListView class uses .Text property when drawing items, but that is not truth
// my idea was to 'cheat' a little with:
new public String Text
{
get
{
// overriding a getter should be enough i thought, but i was wrong
return( some string value from DataStorage class passed via constructor );
// setter is not rly needed here, because data comes from this._storage class;
// in later stages i've even added this line, to be informed whenever it's called ofc before return( ); otherwise VisualStudio would not compile
MessageBox.Show( "Calling item's .Text property" );
// guess what? this message box NEVER shows up;
}
}
}
.Textセッターを使用することは重要だと思いますが、コンストラクターは、作成直後にcListViewItemがListView Itemsプロパティに追加されて表示されるため、.Text=""を再度呼び出す場所がないために実行できる最後の瞬間です。
私のコードは、cListViewItemのコンストラクターで次のようにすべてを設定した場合にのみ機能します。
public cListViewItem( myclass DataStorage )
{
this._storage = DataStorage;
this.Text = DataStorage.String1;
// and if I add subitems here, I will see em when the ListView.View property be changed to View.Details
}
だから私は盲目ですか、それとも何ですか?cListViewItem.Text = "string"を使用すると、ListViewに「string」が表示されますが、.Text getterをオーバーライドすると、アイテムが表示されません:(
ListViewクラスは、必要な方法でアイテムを表示する柔軟性を提供します。カスタムデータストレージクラスをListViewクラスにバインドするクラスを作成したかったのです。アプリケーションの次の段階で、ListViewで選択したアイテムのフォームをバインドします。これにより、アイテム(カスタムクラス)の値を変更できるようになります。そのため、各ListViewItemsアイテムに対応するカスタムデータストレージクラスを記憶させたいと思いました。
ListViewに表示される名前は一意になることはないため、複数の同じ名前を使用できますが、アイテムはID値(データベースごと)が異なります。
ListViewItem.Textセッターを使用するとうまくいく理由がわかりませんが、ListViewクラスはアイテムの表示にListViewItem.Textゲッターを使用しません(メッセージボックスがポップアップしない)??
plsは役立ちます。