2012-11-28 78 views
1

我在System.Windows.Forms的ListView中的一個問題,我不能處理它自己,乞求幫助或暗示我在哪裏做錯了?
說明:
- 我有一個類 - 它命名爲cListViewItem(從定製的「C」),從標準ListViewItem的繼承,而是將它保存自己的數據處理類。現在,使用ListView.items.Add()添加cListViewItem到ListView類後,我似乎沒有任何控制該項目的名稱。
- 我的源代碼的片段(律改變這個帖子的目的)繼承的ListViewItem中的WinForms,C#,.Net2.0

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; 
    } 
    } 
} 

我看到使用。文本制定者是很重要的,但是構造器是最後時刻我能做到這一點,之後創作cListViewItem是被添加到ListView Items屬性並顯示,所以沒有地方再次調用.Text =「」。

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的構造像所有的東西的作品?當我使用cListViewItem.Text =「字符串」我會看到「字符串」 在ListView但是當我剛覆蓋。文本吸氣我看不到的物品:(

的ListView類對顯示項目的靈活性我想創建一個類,將我的自定義數據存儲類綁定到一個ListView類。在我的應用程序的下一個階段,我想綁定一個ListView中的選定項目的表單,這將允許我更改項目的我的自定義類)值。這就是爲什麼我想讓每個ListViewItems項目記住相應的自定義數據存儲類。
在ListView中顯示的名稱永遠不會是唯一的,所以多個相同的名稱都是允許的,但項目會因ID值而不同(數據庫 - );
我只是不明白爲什麼usi ng ListViewItem.Text setter完成這項工作,altho ListView類不使用ListViewItem.Text getter來顯示項目(我的MessageBox永遠不會彈出)??
請幫忙。

回答

1

這裏的主要問題是你正在隱藏的財產關鍵字。原始屬性不是virtual(「可覆蓋」),因此它不會被覆蓋,而是被遮蔽。

閱讀here瞭解更多信息。

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; 
} 

屬性和方法的價值至少隱藏我自己有點困惑,我不記得規則,但最終自動完成的文本調用不會被稱爲您的版本...

+0

對於提示太多了,你是對的 - 這是規則。如果ListView使用從我的cListViewItem轉換爲ListView,這就足夠了,這是使用基類的方法(屬性)。無論我使用.Tag屬性還是派生類,我仍然需要使用.Text設置器。 Ty –

+0

@KrzysztofP:太好了,如果修復它然後將其標記爲答案然後幫助其他人,並歡迎來到StackOverflow。 – Ian