【问题标题】:How do I add to a specific column in Listview item?如何添加到 Listview 项目中的特定列?
【发布时间】:2010-11-18 08:15:46
【问题描述】:

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

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

假设作为列文本的 "1850" 将是目标列。

【问题讨论】:

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


    【解决方案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 > 是子项。

    【讨论】:

    • 暗星,你需要切换到报表视图并首先插入第二列(我猜是lv.Columns.Add)。请注意,Listview 将报表视图中的整行视为单个“项目”,子项目的功能是有限的。
    • 该死的丑...一定有更好的解决方案。
    【解决方案2】:

    我通常将 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"}));
    

    【讨论】:

    • 哇,非常好的实现。 +1
    【解决方案3】:
    ListViewItem item = new ListViewItem("foo");
    item.SubItems.Add("foo2");
    this.listView1.Items.Add(item);
    

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

    Chernikov 很好地实现了它,让事情变得更加理智。

    【讨论】:

      【解决方案4】:

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

      希望有帮助!

      【讨论】:

      • 非常感谢 SK93 的解释,让像我这样的菜鸟可以理解,也感谢 Chernikov 的想法。
      • 很好的答案!谢谢!来自 Sk93 的惊人语录,“我们曾经都是菜鸟”,非常鼓舞人心和激励! :)
      【解决方案5】:

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

      我正在使用 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 ] 来查找我想要的数据的适当序号。

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

      【讨论】:

        【解决方案6】:
         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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-29
          相关资源
          最近更新 更多