继承WinForms中的ListViewItem,C#,。Net2.0

时间:2012-11-28 12:27:22

标签: c# listview

我在System.Windows.Forms中遇到了ListView的问题,我无法自行处理,请求帮助或暗示我哪里做错了?
说明:
- 我有一个类 - 将它命名为cListViewItem(来自自定义的'c'),它继承自标准的ListViewItem,但存储了我自己的数据处理类。现在,在使用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 setter是很重要的,但是构造函数是我可以做到的最后一刻,创建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”时,我会看到'string' 在ListView中,但当我只是覆盖.Text getter时,我看不到项目:(

ListView类提供了以我需要的方式显示项目的灵活性。我想创建一个类,将我的自定义数据存储类与ListView类绑定。在我的应用程序的下一个阶段,我想在ListView中绑定选定项目的表单,这将允许我更改项目(我的自定义类)值。这就是为什么我想让每个ListViewItems项记住相应的自定义数据存储类 ListView中显示的名称永远不会是唯一的,因此允许多个相同的名称,但项目将因id值而异(数据库方式);
我只是想不通为什么使用ListViewItem.Text setter完成这项工作,而ListView类不使用ListViewItem.Text getter来显示项目(我的MessageBox永远不会弹出)?? 请帮助。

2 个答案:

答案 0 :(得分:1)

这里的主要问题是您使用new关键字隐藏了该属性。原始属性不是virtual(“可覆盖”),因此不会被覆盖但会被遮挡。

阅读here了解详情。

答案 1 :(得分: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的调用并不会调用你的版本...