如何添加Listview项目中的特定列?

时间:2009-08-10 15:41:23

标签: c# .net winforms listview user-interface

我创建了一个listview,并且在运行时确定了列数。我一直在网上阅读有关listview的文本(我仍然是)但我想知道如何将项目添加到listview中的特定列我想到的是:

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

可以使用“1850”,这是列的文本将是目标列。

6 个答案:

答案 0 :(得分:18)

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

现在我们在ListViewItem中有A,B和C列,文本出现在A和C列中,但不是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 :(得分:6)

我通常将ListView Item继承为:

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

答案 2 :(得分:1)

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

ListViews不支持数据绑定和强类型命名。我建议考虑使用DataGridView。根据您的需要,它可以为您节省一些理智点。

Chernikov已经很好地实施了让事情变得更加健全。

答案 3 :(得分:1)

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

我使用listView将数据库中的信息显示给用户。 (我可能应该使用DataGrid,但是当我第一次创建程序时,DataGrid没有内置完整行选择,而且我对于通过我发现的自定义控件示例来说太过新了)

用户可以选择要显示的总数,宽度和标题文字。

我创建了一个用户首选项表,用于保存有关要添加的列的信息

  • ColumnVisible = bool
  • ColumnText = string =要在标题
  • 中显示的文字
  • columnWidth = int
  • ColumName = string =此列在我的其他数据库中引用的确切名称
  • ColumnIndex = int =列的显示索引

我还创建了一个类ColumnPreferences,并为每个列添加了一个属性

使用DataReader制作List<ColumnPreferences>

我根据显示索引对此列表进行排序,因此我可以按列显示的顺序迭代它。

我执行if语句检查首选项中的下一个首选项是否可见。

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

添加列

此时列都已设置,以保存用户拖动它们的位置,基本上相反。我遍历Listview.columns中的所有列并将列显示索引和列宽保存回我的用户首选项表

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

它再次按显示索引排序,我检查它是否可见,如果不是我跳过它并转到下一个

如果可见,我使用myDataReader[ ColumnPreference.ColumnName ]查找我想要的数据的适当序数。

我只是按顺序将每个结果添加到列表视图项/子项中,然后将它们添加到列表视图中

答案 4 :(得分:0)

 For i = 0 To listAcheivments.Items.Count - 1
    Dim arrparam2(,) As String
    arrparam2 = New String(,) {{"@emp_code", txtEmpCode.Text}, {"@ach_year", CDate("01-01-" & listAcheivments.Items(i).SubItems(0).Text)}, {"@acheivement", listAcheivments.Items(i).SubItems(1).Text}}

    SaveData(arrparam2, "insert_acheivements")

Next

答案 5 :(得分:-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>是子项目。