Creating an item(Under the key) is easy,but how to add subitems(Value)?
listView1.Columns.Add("Key"); listView1.Columns.Add("Value"); listView1.Items.Add("sdasdasdasd"); //How to add "asdasdasd" under value? Creating an item(Under the key) is easy,but how to add subitems(Value)?
listView1.Columns.Add("Key"); listView1.Columns.Add("Value"); listView1.Items.Add("sdasdasdasd"); //How to add "asdasdasd" under value? You whack the subitems into an array and add the array as a list item.
The order in which you add values to the array dictates the column they appear under so think of your sub item headings as [0],[1],[2] etc.
Here's a code sample:
//In this example an array of three items is added to a three column listview string[] saLvwItem = new string[3]; foreach (string wholeitem in listofitems) { saLvwItem[0] = "Status Message"; saLvwItem[1] = wholeitem; saLvwItem[2] = DateTime.Now.ToString("dddd dd/MM/yyyy - HH:mm:ss"); ListViewItem lvi = new ListViewItem(saLvwItem); lvwMyListView.Items.Add(lvi); } listView.Items.Add(new ListViewItem(new string[]{"Col1", "SubItem2", "SubItem3", "And so on"}));Suppose you have a List Collection containing many items to show in a ListView, take the following example that iterates through the List Collection:
foreach (Inspection inspection in anInspector.getInspections()) { ListViewItem item = new ListViewItem(); item.Text=anInspector.getInspectorName().ToString(); item.SubItems.Add(inspection.getInspectionDate().ToShortDateString()); item.SubItems.Add(inspection.getHouse().getAddress().ToString()); item.SubItems.Add(inspection.getHouse().getValue().ToString("C")); listView1.Items.Add(item); } That code produces the following output in the ListView (of course depending how many items you have in the List Collection):
Basically the first column is a listviewitem containing many subitems (other columns). It may seem strange but listview is very flexible, you could even build a windows-like file explorer with it!
Inspection class since it has to know all the internals...I've refined this using an extension method on the ListViewItemsCollection. In my opinion it makes the calling code more concise and also promotes more general reuse.
internal static class ListViewItemCollectionExtender { internal static void AddWithTextAndSubItems( this ListView.ListViewItemCollection col, string text, params string[] subItems) { var item = new ListViewItem(text); foreach (var subItem in subItems) { item.SubItems.Add(subItem); } col.Add(item); } } Calling the AddWithTextAndSubItems looks like this:
// can have many sub items as it's string array myListViewControl.Items.AddWithTextAndSubItems("Text", "Sub Item 1", "Sub Item 2"); Hope this helps!
myListViewControl.Items.AddWithTextAndSubItems("Text", "Sub Item 1", "Sub Item 2"); becomes ListViewItemCollectionExtender.AddWithTextAndSubItems(myListViewControl.Items, "Text", "Sub Item 1", "Sub Item 2"); Compiler magic!!I think the quickest/neatest way to do this:
For each class have string[] obj.ToListViewItem() method and then do this:
foreach(var item in personList) { listView1.Items.Add(new ListViewItem(item.ToListViewItem())); } Here is an example definition
public class Person { public string Name { get; set; } public string Address { get; set; } public DateTime DOB { get; set; } public uint ID { get; set; } public string[] ToListViewItem() { return new string[] { ID.ToString("000000"), Name, Address, DOB.ToShortDateString() }; } } As an added bonus you can have a static method that returns ColumnHeader[] list for setting up the listview columns with
listView1.Columns.AddRange(Person.ListViewHeaders()); ListViewItem item = new ListViewItem(); item.Text = "fdfdfd"; item.SubItems.Add ("melp"); listView.Items.Add(item);