2016-12-01 94 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