【问题标题】:Populating Listview with columnar data使用列数据填充 Listview
【发布时间】:2013-05-23 15:33:12
【问题描述】:

您好,我按照答案填充列表视图,但列表视图是水平填充的,但我需要按列填充 这是我的代码

listView1.Items.Clear();
listView1.Columns.Clear();

Dictionary<string, List<string>> Values = new Dictionary<string, List<string>>();
Values.Add("CODE", list_p_code);
Values.Add("NAME", list_p_name);
Values.Add("MRP", list_mrp);
Values.Add("ORDERS", list_order_qty);
Values.Add("PENDING", list_variance_qty);

foreach (string key in Values.Keys)
{
    listView1.Columns.Add(key, -2,HorizontalAlignment.Left);
    // Fill item
    ListViewItem item = new ListViewItem(key);

    // Fill Sub Items
    List<string> list = Values[key];

    foreach (string data in list)
    {
        item.SubItems.Add(data.ToString());
    }

    // Add to the ListView
    listView1.Items.Add(item);

}

输出如下:

CODE 1 2
NAME x y
ORDERS 4 4
...

但我想要它作为

CODE NAME ORDERS ...
1    x    4
2    y    4

我该怎么做?

【问题讨论】:

标签: c# listview


【解决方案1】:

很难理解你想做什么。如果你愿意:

CODE NAME ORDERS ...
1    x    4
2    y    4

然后很自然地会想到,您有一组包含这 3 个字段的商品,并且每个商品代码都有各自的名称和订单数。

现在,您的数据结构设计绝对不正确!这就是你有问题的原因!

让我们看看你的代码:

  1. 如果list_p_code.Length != list_p_name.Length 怎么办?您如何预期您的 listView 会显示它?
  2. 您在实际添加列表项的同一周期中动态添加列。也就是说,每次迭代都会出现新列。但是,您如何预计在所有列初始化之前添加一个项目?考虑一下。

具有正确数据结构的示例。请注意,您应该在开始迭代项目之前初始化所有列。

public class YourItem
{
    public string Code { get; set; }
    public string Name { get; set; }
    public string MRP { get; set; }
    public int OrdersCount { get; set; }
    public int PendingCount { get; set; }           
}

void YourHandler()
{
    listView1.Items.Clear();
    listView1.Columns.Clear();

    var items = new[] 
    {
        new YourItem { Code = "Code1", Name = "Name1", MRP = "MRP1", OrdersCount = 1, PendingCount = 1 },
        new YourItem { Code = "Code2", Name = "Name2", MRP = "MRP2", OrdersCount = 2, PendingCount = 2 },
        new YourItem { Code = "Code3", Name = "Name3", MRP = "MRP3", OrdersCount = 3, PendingCount = 3 },
    };

    listView1.Columns.Add("CODE", -2,HorizontalAlignment.Left);
    listView1.Columns.Add("NAME", -2,HorizontalAlignment.Left);
    listView1.Columns.Add("MRP", -2,HorizontalAlignment.Left);
    listView1.Columns.Add("ORDERS", -2,HorizontalAlignment.Left);
    listView1.Columns.Add("PENDING", -2,HorizontalAlignment.Left);

    foreach (var item in items)
    {
        // Fill item
        ListViewItem item = new ListViewItem(item.Code);
        item.SubItems.Add(item.Name);
        item.SubItems.Add(item.MRP);
        item.SubItems.Add(item.OrdersCount);
        item.SubItems.Add(item.PendingCount);

        // Add to the ListView
        listView1.Items.Add(item);  
    }
}

【讨论】:

    【解决方案2】:

    CODE, NAME, ORDERS 添加为列标题,而不是行的一部分。然后像之前一样添加{1,x,4} & {2,y,4} 作为行数据。

    listview.Columns.Add()
    

    【讨论】:

      【解决方案3】:

      来自 MSDN 的示例:这是您添加的方式(项目和子项目,然后是下一个项目及其子项目):

      // Create three items and three sets of subitems for each item.
      ListViewItem item1 = new ListViewItem("CODE",0);
      item1.SubItems.Add("NAME");
      item1.SubItems.Add("ORDERS");
      ListViewItem item2 = new ListViewItem("1",1);
      item2.SubItems.Add("x");
      item2.SubItems.Add("4");
      ListViewItem item3 = new ListViewItem("2",2);
      item3.SubItems.Add("y");
      item3.SubItems.Add("4");
      

      基于:http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.items.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-16
        • 1970-01-01
        相关资源
        最近更新 更多