2016-12-01 35 views
0

假設我建立ListView與下面的代碼:ListViewItem的隱式添加ListViewSubItem

ListViewItem item1 = new ListViewItem(); 
item1.Text = "item1"; 
item1.SubItems.Add(new ListViewItem.ListViewSubItem(item1, "subitem1")); 
item1.SubItems.Add(new ListViewItem.ListViewSubItem(item1, "subitem2")); 
listView1.Items.Add(item1); 

但實際上它會創建3個ListViewSubItem就像這樣:

ListViewItem 
    | 
    ------------------------------------- 
    |     |    | 
ListViewSubItem ListViewSubItem ListViewSubItem 
(Text=item1) (Text=subitem1) (Text=subitem2) 

在我真正的程序中,我使用衍生自子項目來自ListViewItem.ListViewSubItemOwnerDraw = true

ListViewItem item1 = new ListViewItem(); 
CustomListViewSubItem subitem1 = new CustomListViewSubItem(item1, "subitem1"); 
CustomListViewSubItem subitem1 = new CustomListViewSubItem(item1, "subitem1"); 
listView1.Items.Add(item1); 

和上述行爲打破了所有的邏輯,同時在鑄造事件DrawSubItems

private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) 
{ 
    ListViewItem item = e.Item; 
    ListViewItem.ListViewSubItem subitem = item.SubItems[e.ColumnIndex]; 
    CustomListViewSubItem customsubitem = (CustomListViewSubItem)subitem; // <- System.InvalidCastException here 
    ... 
} 

肯定會失敗僅適用於第一個子項目這實際上是項目,但是這不是我想要的。我如何避免這種行爲,並只創建2個我需要的子項?

+0

你有可能,如果新的實例時檢查'ListViewItem'子項列表是空的?也許它只是在初始化時添加一個標準子項? –

+0

檢查'ListViewItem'文檔https://msdn.microsoft.com/en-us/library/system.windows.forms.listviewitem.subitems(v=vs.110).aspx它說第一個項目總是父項。 – Mats391

回答

1

未經測試,但可能有效:
通過在空集合上調用listView.SubItems,它會自動添加一個「default」元素。我的建議是增加你的元素等之後,除去第一個元素:

listView.SubItems.Add(new MeListViewSubItem(...)); 
listView.SubItems.RemoveAt(0); 

ReferenceSource

/// <include file='doc\ListViewItem.uex' path='docs/doc[@for="ListViewItem.SubItems"]/*' /> 
    /// <devdoc> 
    /// <para>[To be supplied.]</para> 
    /// </devdoc> 
    [ 
    SRCategory(SR.CatData), 
    DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),   
    SRDescription(SR.ListViewItemSubItemsDescr), 
    Editor("System.Windows.Forms.Design.ListViewSubItemCollectionEditor, " + AssemblyRef.SystemDesign,typeof(UITypeEditor)), 
    ] 
    public ListViewSubItemCollection SubItems { 
     get { 
      if (SubItemCount == 0) { 
       subItems = new ListViewSubItem[1]; 
       subItems[0] = new ListViewSubItem(this, string.Empty);       
       SubItemCount = 1; 
      } 

      if (listViewSubItemCollection == null) { 
       listViewSubItemCollection = new ListViewSubItemCollection(this); 
      } 
      return listViewSubItemCollection; 
     } 
    } 
+0

好的,我現在看到問題出在哪裏,謝謝。我來自C++世界,看起來我從來沒有習慣C#中缺乏邏輯和混亂。 – folibis