用于多列使用的 ListView 与 ListBox

Posted

技术标签:

【中文标题】用于多列使用的 ListView 与 ListBox【英文标题】:ListView vs. ListBox for multiple column usage 【发布时间】:2012-04-02 08:18:12 【问题描述】:

我目前正在为我的应用程序的 GUI 苦苦挣扎。我很难确定 ListBox 或 ListView 是否更“适合”数据的多列表示。

我更喜欢“干净”的代码,这种代码不会让人难以理解,因为意大利面条式代码和黑客方法会导致混乱。

ListBox 和 ListView 如何处理多列?

【问题讨论】:

@BryanCrosby,我现在正在处理列表数据。我了解 DataGridView 适用于数据库数据。 你说你有多列表示。那是一张桌子,这就是我推荐它的原因。你的数据结构是什么? @BryanCrosby,我的数据现在表示为一个列表。 Datagridview 适用于您希望在网格中显示的任何类型的数据。我尽可能使用列表控件,因为它们更轻,但是当您需要数据的灵活性和多列表示时,datagridview 很难被击败。 【参考方案1】:

ListView 对于数据的多列表示要好得多。但是,它似乎比简单的 ListBox 代码更复杂/丑陋。

由于许多原因,可调整大小的列等等,它仍然要好得多。

我不认为 ListBox 有多个列,因此您必须在其中添加一些丑陋的东西。

http://www.xtremedotnettalk.com/showthread.php?t=93443

【讨论】:

我能在这两种类型上找到的所有示例都以有些混乱的代码结尾。但正如你所说, ListView 似乎更合适。你能在多列 ListView 上给出一个 coden-p 吗?谢谢。 ListBox 控件确实支持multiple columns。 “多列列表框将项目放置到所需的列中,使垂直滚动变得不必要。”我不认为它有帮助。 xtremedotnettalk.com/showthread.php?t=93443 有一个代码示例。我这里没有我的代码,否则我会从我的一个项目中给你一些东西【参考方案2】:

看看这个

https://***.com/a/227355/988830

虽然 listbox 用于单列,listview 用于多列,但答案完全取决于。

有时您可能需要多列列表,您需要在其中添加不同类型的子项。您不能使用 listview 绑定它们,因此在这种情况下使用 listbox 更好。但是如果你想使用 header 对它们进行排序,请使用 listview,因为它很简单。

总之,我想说的是,如果你只有多列数据,而如果你想做一些花哨的东西,比如按钮、树视图、扩展器等,那么使用 listview 再好不过了。ListBox 真的很酷。

谢谢, 奥姆卡

【讨论】:

【参考方案3】:

如果您希望能够直接从网格(如电子表格)编辑数据,DataGridView 是不错的选择。详细模式下的列表视图非常适合简单呈现数据列列表。据我所知,DataGridView 也更容易排序。

通常我会这样做:

private void UpdateListView()

   mListView.Items.Clear();
   foreach (Item item in mItems)
   
      ListViewItem listViewItem = 
         new ListViewItem(item.Value1.ToString())  Tag = item; 
      listViewItem.SubItems.Add(item.Value2.ToString());
      listViewItem.SubItems.Add(item.Value3.ToString());
      mListView.Items.Add(listViewItem);
   

需要在设计器中定义列,包括列标题文本和列宽。

使用 Tag = item; 部分,您将能够通过以下方式访问所选对象:

   if (mListView.SelectedIndices.Count <= 0)
      return;

   Item selectedItem = mListView.SelectedItems[0].Tag as Item;
   if (selectedItem == null)
      return;

   // do something with selectedItem

【讨论】:

【参考方案4】:

在这种情况下,DataGridView 肯定没有问题。

示例:

class Car

    public string Make  get; set; 
    public string Model  get; set; 
    public int Year  get; set; 

将数据加载到DataGridView的函数

private void LoadData()

    List<Car> cars = new List<Car>()
    
       new Car()  Make = "Subaru", Model = "Impreza", Year = 2005 ,
       new Car()  Make = "Ford", Model = "Mustang", Year = 1984 
    ;

    dataGridView1.DataSource = cars;

当然,从这里开始,事情可能会变得更加复杂,但如果您只是想以表格方式显示数据......这很简单。

【讨论】:

完美。正是我想要的。只需要添加一行代码来初始化数据源就可以了。 是否可以排除任何列或更改它们的顺序? @JavaCake:您可以使用它们的命名索引或序号访问列。例如DataGridView.Columns[0]。有一个属性DisplayIndex 控制它们的显示方式。还有一个Visible 属性控制可见性。

以上是关于用于多列使用的 ListView 与 ListBox的主要内容,如果未能解决你的问题,请参考以下文章

多列 ListView 上的图标

多列listview错误视图

光标数组进入 ListView 但多列

多列 ListView 显示零而不是数据库值

多列ListView显示零而不是数据库值

多列listview UWP