【问题标题】:ListView: Items are not correctly addedListView:项目未正确添加
【发布时间】:2013-08-09 22:27:41
【问题描述】:

我有 3 个列(1996、1997、1998),它们来自数据库。我想在列表视图中显示它们。

我的问题是,它完美地显示了所有第一列数据,但第二列数据在第一列结束后开始。此外,最后两列放在一起。

{
     listView1.Items.Clear();
     SqlConnection cnn = new SqlConnection(tools.ConnectionString);
     SqlCommand cmd = new SqlCommand("alti", cnn);
     cmd.CommandType = CommandType.StoredProcedure;

     cmd.Parameters.AddWithValue("@name", comboBox1.SelectedItem);
     cnn.Open();
     SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

     while (dr.Read())
     {
         int yil = Convert.ToInt32(dr["yil"].ToString());
         ListViewItem lvitem = new ListViewItem();

         if (yil == 1996)
         {
             lvitem.Text =(dr["OrderID"].ToString() + "--" + dr["Fiyat"].ToString() );
         }
         else if (yil == 1997)
         {
             lvitem.SubItems.Add(dr["OrderID"].ToString() + "--" + dr["Fiyat"].ToString());
         }
         else if (yil == 1998)
         {
             lvitem.SubItems.Add(dr["OrderID"].ToString() + "--" + dr["Fiyat"].ToString());                   
         }
             listView1.Items.Add(lvitem);                   
     }
         cnn.Close();
}

【问题讨论】:

    标签: c# listview listviewitem


    【解决方案1】:

    虽然您的问题是关于旧版ListView。对于像您这样的目的,在VirtualMode 中使用ListView 更合适(请参阅ListView.VirtualMode)。此外,如果您想尝试一些新的和更强大的BrightIdeasSoftware.ObjectListView (OLV),它是一个第三方控件,效果会更好。您可以在 OLV 中添加您的项目(这将是对象 :)),难度较小。它也有很多造型工具。看看它here

    【讨论】:

    • ObjectListview 看起来非常有用,但 bot 在 vs2012 上工作:( 并尝试使用 listview.virtualmode thanx 来实现这一点:)
    【解决方案2】:

    Listview 的第一列是您创建 Items.Add() 的地方,第二列及以后的地方是您使用 SubItems.Add() 的地方。换句话说, seocnd 列及以后的列与第二列绑定。

    为了说明它会是这样的:

    ListViewItem itm = listView1.Items.Add('First Column');
    itm.SubItems.Add('Second Column');
    itm.SubItems.Add('Third Column');
    

    现在,在您的情况下,这有点棘手,因为多条记录会变成多列,例如数据透视表。所以,我建议先收集 1996 年到 1997 年的所有年份,然后再将其添加到 listview 中,例如:

     String for96='',for97='',for98='';
    
     while (dr.Read())
         {
             int yil = Convert.ToInt32(dr["yil"].ToString());
    
    
             if (yil == 1996)
             {
                 for96 =(dr["OrderID"].ToString() + "--" + dr["Fiyat"].ToString() );
             }
             else if (yil == 1997)
             {
                 for97 = dr["OrderID"].ToString() + "--" + dr["Fiyat"].ToString();
             }
             else if (yil == 1998)
             {
                 for98=dr["OrderID"].ToString() + "--" + dr["Fiyat"].ToString();                
             }
             if (!String.IsNotNullOrEmpty(for96) && !String.IsNotNullOrEmpty(for97) && !String.IsNotNullOrEmpty(for98))
             {
                 ListViewItem itm = new ListViewItem();
                 itm = listView1.Items.Add(for96);
                 itm.SubItems.Add(for97);          
                 itm.SubItems.Add(for98);      
    
                 for96='',for97='',for98='';
             }
    
         }
    

    【讨论】:

    • 我在最后一行使用它 for96='',for97='',for98='';它为所有列返回 1 行。当删除该行时,for96 和 for97 重复同一行。
    • @onurasan 你能告诉我你表的实际数据吗?从那里我将修改我的答案。谢谢。
    • 我从 Northwind 示例数据库收集数据,但查询端工作正常。现在我有 3 个数组(for96,for97,for98)或列表(for96,for97,for98)我需要用 listview 显示它们.你可以使用数组或列出它:)
    • 您在 Northwind 数据库中指的是哪个特定表?我专门在 Orders 表上查看它,因为您提到了 OrderID,但我找不到 yilfiyat 字段。
    • 你找不到他们因为我给他们随机的名字。我在 mssql 上创建过程 go alter proc alti @name nvarchar(max)='' as select o.OrderID as OrderID,(od.UnitPrice*od.Quantity*(1+od.Discount))as Fiyat, DATEPART(year, OrderDate) as yil from Categories as c inner join Products as p on c.CategoryID=p.CategoryID inner join [Order Details] as od on od.ProductID=p.ProductID inner join Orders as o on o.OrderID=od.OrderID其中 c.CategoryName=@name 和 (DATEPART(year,OrderDate) between 1996 and 1998) 按 1 desc 排序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多