2009-08-10 71 views
4

我创建一个列表视图和列的数量是在运行时确定的。我一直在阅读网络上的文字全约的ListView(和我仍然是),但我想知道如何将项目的列表视图添加到特定的专栏中,我想是这样的:如何添加到Listview项目中的特定列?

m_listview.Items.Add("1850").SubItems.Add("yes"); 

会的工作假设“1850”这是列的文本将是目标列。

回答

16

ListViewItems不知道您的ListView列。

为了直接引用列,首先需要将所有列添加到ListViewItem。

所以...可以说你的ListView有三列A,B和C; 这接下来的代码位只会将数据添加到列A:

ListViewItem item = new ListViewItem(); 
item.text = "Column A"; 

m_listView.Items.Add(item); 

得到它的文本添加到C柱,以及,我们首先需要告诉它,它有一个B柱...

ListViewItem item = new ListViewItem(); 
item.text = "Column A"; 
item.SubItems.Add(""); 
item.SubItems.Add("Column C"); 

m_listView.Items.Add(item); 

所以现在我们必须出现在A和C柱列A,B和C在ListViewItem和文本,而不是B.

最后......现在我们已经告诉它,它有三列,我们可以做任何我们喜欢的那些特定列...

ListViewItem item = new ListViewItem(); 
item.text = "Column A"; 
item.SubItems.Add(""); 
item.SubItems.Add("Column C"); 

m_listView.Items.Add(item); 

m_listView.Items[0].SubItems[2].Text = "change text of column C"; 
m_listView.Items[0].SubItems[1].Text = "change text of column B"; 
m_listView.Items[0].SubItems[0].Text = "change text of column A"; 

希望有帮助!

+1

非常感谢SK93对它的解释,以便像我这样的noob可以理解和切尔尼科夫的想法。 – 2009-08-10 19:28:34

+1

呵呵,不客气......我们都是小菜一次:) – Sk93 2009-08-10 22:24:24

+2

很好的答案!谢谢!来自Sk93的惊人报价,“我们都是小菜一次”,非常鼓舞人心和激励! :) – neo 2012-07-27 23:22:08

-1

可能是这样的吗?

ListViewItem item = m_listview.Items.Add("1850"); 
item.Subitems.Add(string.Empty); //Make an add method that does this for every column you got and then you can use the indexer below. 
item.Subitems[1].Text = "Test"; 

索引0是主要项目。索引1>是子项目。

+0

您的代码不起作用 – 2009-08-10 15:56:18

+0

暗星,你需要切换到报表视图和首先插入第二列(lv.Columns.Add,我猜)。请注意,Listview将报告视图中的整行视为单个“Item”,子项的功能是有限的。 – peterchen 2009-08-10 16:01:52

+2

该死的丑陋......必须有更好的解决方案。 – 2009-08-10 16:14:46

5

我usially继承的ListViewItem为:

public class MyOwnListViewItem : ListViewItem 
{ 
    private UserData userData; 

    public MyOwnListViewItem(UserData userData) 
    { 
     this.userData = userData; 
     Update(); 
    } 

    public void Update() 
    { 
     this.SubItems.Clear(); 
     this.Text = userData.Name; //for first detailed column 

     this.SubItems.Add(new ListViewSubItem(this, userData.Surname)); //for second can be more 
    } 
} 

其中

public class UserData 
{ 
    public string Name; 
    public string Surname; 
} 

使用

listView1.Items.Add(new MyOwnListViewItem(new UserData(){Name="Name", Surname = "Surname"})); 
+0

哇,非常好的实现。 +1 – 2009-08-10 16:07:19

1
ListViewItem item = new ListViewItem("foo"); 
item.SubItems.Add("foo2"); 
this.listView1.Items.Add(item); 

列表视图不支持数据绑定和强类型命名。我会建议考虑使用DataGridView。根据你的需要,它可以为你自己节省一些理智点。

切尔尼科夫已经很好地实施了,让事情变得更加安全。

1

这就是我所做的,因为列是在运行时通过用户首选项添加的。

我正在使用listView将数据库中的信息显示给用户。(我也许应该使用DataGrid的,但是当我第一次做节目的DataGrid并没有内置全行选择,我是过大对于新手,都要经过自定义控件的例子,我发现)

用户选择哪他们想要显示的列总数,多宽和标题文本。

我创建的保存有关的列的信息来添加用户偏好表

  • ColumnVisible =布尔
  • ColumnText =字符串=文本,以显示在报头
  • columnWidth时= INT
  • ColumName = string =这个列在我的其他数据库中引用的确切名称
  • ColumnIndex = int =列的显示索引

我还做了一类ColumnPreferences并添加属性为每个列的

使用的DataReader使List<ColumnPreferences>

我根据显示的索引排序这个名单,所以我可以通过它的迭代顺序显示列。

我做了一个if语句,检查偏好设置中的下一个首选项是否可见。

如果是那么我添加使用ListView1.Columns.Add(ColumnName, ColumnText, ColumnWidth);

列在这一点上的列都设置,保存在用户周围拖动他们我基本上做相反。我遍历Listview.columns中的所有列,并将列显示索引和列宽保存回我的用户优选表中

从表中加载实际数据时,我使用相同的列首选项来检查是否应该显示数据。

它是由显示指数再次排序,我检查,如果它是可见的,如果不是我跳过它,去下一个

如果它是可见我使用myDataReader[ ColumnPreference.ColumnName ]查找的approprate序我想要的数据。

我只是添加的每个这些结果,为了到一个列表视图项/子项,然后将它们添加到列表视图

相关问题