C# ListView:未正确添加项

C# ListView:未正确添加项,c#,listview,listviewitem,C#,Listview,Listviewitem,我有3个冒号(1996、1997、1998),它们来自DB。我想在列表视图中显示它们 我的问题是,它完美地显示了所有第一列数据,但第二列数据在第一列结束后开始。另外,最后两列放在一起 { listView1.Items.Clear(); SqlConnection cnn = new SqlConnection(tools.ConnectionString); SqlCommand cmd = new SqlCommand("alti", cnn); cm

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

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

{
     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();
}

Listview的第一列是创建Items.Add()的位置,第二列及其后是使用SubItems.Add()的位置。换句话说,seocnd列和beyond列与第二列绑定

要说明这一点,可以这样说:

ListViewItem itm = listView1.Items.Add('First Column');
itm.SubItems.Add('Second Column');
itm.SubItems.Add('Third Column');
现在在您的例子中有点棘手,因为在透视表中,多个记录将变成多个列。因此,我建议在将其添加到listview之前,收集1996年至1997年的所有年份,如:

 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='';
         }

     }

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

shen我将其与最后一行一起用于96='',97='',98='';它为所有列返回1行。删除该行时,对于96和97,请重复同一行。@onurasan您能给我看一下表的实际数据吗?然后我会修改我的答案。谢谢。我从Northwind样本数据库收集数据,但查询端工作得很好。现在我得到了3个数组(for96、for97、for98)或列表(for96、for97、for98),我需要用listview显示它们。您可以使用数组或列出它,具体取决于您:)您在Northwind数据库中引用的表是什么?我特别在订单表bcoz上查看了它,您提到了OrderID,但我找不到yil或fiyat字段。您找不到它们,因为我给了它们randm名称。我在mssql上创建过程,将alter proc alti@name nvarchar(max)=''作为OrderID,选择o.OrderID作为OrderID,(od.UnitPrice*od.Quantity*(1+od.Discount))作为Fiyat,DATEPART(year,OrderDate)作为yil,从类别中作为c内部联接产品作为p在c.CategoryID=p.CategoryID内部联接[订单详细信息]在od.ProductID=p.ProductID内部连接订单在o.OrderID=od.OrderID上作为o,其中c.CategoryName=@name和(日期部分(年份,ORDERDDATE)在1996年至1998年之间)order by 1 descObjectListview看起来非常有用,但在vs2012上无法正常工作:(并尝试使用listview.virtualmode thanx进行此操作:)