我在 System.Windows.Forms 中遇到了 ListView 的问题,我无法自己处理它,请求帮助或提示我哪里做错了?
描述:
- 我有一个类 - 将其命名为 cListViewItem('c' 来自自定义),它继承自标准 ListViewItem,但存储我自己的数据处理类。现在,在使用 ListView.items.Add( ) 将 cListViewItem 添加到 ListView 类之后,我似乎无法控制项目的名称。
- 我的源代码片段(为了这篇文章的目的而改变了)
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" 时,我会在 ListView 中看到 'string' 但是当我只是覆盖 .Text getter 时,我看不到这些项目:(
ListView 类提供了以我需要的方式显示项目的灵活性。我想创建一个类,将我的自定义数据存储类与 ListView 类绑定。在我的应用程序的下一阶段,我想为 ListView 中的选定项目绑定一个表单,这将允许我更改项目(我的自定义类)的值。这就是为什么我想让每个 ListViewItems 项记住相应的自定义数据存储类。
ListView 中显示的名称永远不会是唯一的,因此允许多个相同的名称,但项目会因 id 值而不同(数据库方面);
我只是不明白为什么使用 ListViewItem.Text 设置器来完成这项工作,尽管 ListView 类不使用 ListViewItem.Text 获取器来显示项目(我的 MessageBox 永远不会弹出)?
请帮忙。