用于多列使用的 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的主要内容,如果未能解决你的问题,请参考以下文章