1

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は役立ちます。

4

2 に答える 2

1

ここでの主な問題は、newキーワードを使用してプロパティを非表示にしていることです。元のプロパティはvirtual(「上書き可能」)ではないため、上書きされずにシャドウされます。

詳細については、こちらをお読みください。

于 2012-11-28T14:53:20.887 に答える
0

私が正しく理解していれば、次の点が役立つかもしれません。

カスタムデータを格納するために、実際にListViewItemクラスから派生させる必要はありません。代わりに、ListViewItemのインスタンスを使用して、Tagプロパティを任意のオブジェクトに設定できます。これをDataStorageクラスにすることができます。これを行う場合は、ListViewItemを作成した後、そのテキストを設定します

DataStorage storage = GetDataStorage();  
ListViewItem item = new ListViewItem(storage.Name);
item.Tag = storage;

ListViewItemを継承する場合は、コンストラクターで値を設定します

public cListViewItem( myclass DataStorage )
{
    // constructor only stores DataStorage to a local variable for further use;
    this._storage = DataStorage;
    this.Text = this._storage.Name;
}

プロパティとメソッドの非表示は、少なくとも私自身には少し混乱します。ルールを完全に思い出せませんが、最終的には、自動的に行われるTextの呼び出しでは、バージョンが呼び出されません...

于 2012-11-28T12:40:02.713 に答える