我在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永远不会弹出)??
请帮助。
答案 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的调用并不会调用你的版本...