2013-12-12 89 views
0

我很困惑,是一個相對較新的用戶vb.net。爲什麼我的列表視圖不會修改列表中的值?如果我可以的話,所以我有一個正確的方式來處理listview如何從數據庫中顯示數據。除了我的代碼問題之外,我還有一個常見問題。Listview幫助需要

我在我的listview(0-4)有五列。我是否正確地說,如果我的訪問數據庫包含10個字段,但我只需要顯示其中的5個,但其中一個是字段(9),那麼會像下面的代碼一樣編碼列表,這不會更改值,並且將只顯示列表,如果我刪除'else'語句。

什麼是錯誤?非常感謝

更新的代碼:

oledbCnn.ConnectionString = My.Settings.storageConnectionString 
     oledbCnn.Open() 

     'drcount = Convert.ToInt32(dr("RowCount")) 

     sql = "Select TOP 100 * from Requests ORDER BY [Date-time received] DESC" 
     Debug.Print(sql) 
     Dim oledbCmd As OleDbCommand = New OleDbCommand(sql, oledbCnn) 


     Using dr = oledbCmd.ExecuteReader() 


      'clear items in the list before populating with new values 
      'lvRequests.Items.Clear() 

      While dr.Read() 
       If dr.HasRows Then 
        Dim LVI As New ListViewItem 

        With LVI 
         .Text = dr(0).ToString() 
         .UseItemStyleForSubItems = False 
         .SubItems.Add(CDate(dr(5)).ToShortDateString()) 
         .SubItems.Add(dr(1).ToString()) 
         .SubItems.Add(dr(3).ToString()) 
         If dr(3).ToString = "D" Then 
          .SubItems(3).Text = "Destroyed" 
         ElseIf dr(3).ToString = "O" Then 
          .SubItems(3).Text = "Out" 
         ElseIf dr(3).ToString = "I" Then 
          .SubItems(3).Text = "Intake" 
         End If 
         .SubItems.Add(dr(9).ToString()) 
         If dr(9).ToString = "DEMO" Then 
          .SubItems(9).Text = "Done" 

         End If 
        End With 
        lvRequests.Items.Add(LVI) 

        lvcount += 1 

       End If 

      End While 
     End Using 
+0

重要的是SQL語句中有多少列以及數據如何進入LV。沒有SQL(因此有多少數據列需要處理'SELECT *'和'選擇A,B,C,D,J FROM')。但是,如果您只向LV發佈5位信息,那麼您可能應該引用'SubItems(5)'。也可以在LV中隱藏SubItems。如果添加9個子項目,但只定義了5個列,則只顯示前5個。很難從這個小片段中多說出來。但是,DataGridView通常是數據網格顯示的更好選擇。 – Plutonix

+0

謝謝Plutonix。因此,從你所說的,作爲一個例子,在上面的mycode中,我想要的字段是從0開始的訪問字段9,所以在我的示例中,dr(9)和子項(9)是正確的? – user1532468

回答

1

沒有足夠的信息來真的知道什麼是怎麼回事。看起來你從數據庫中拉出了10列,但是如果你只將它們中的5列發佈到LV,那麼應該只有5個子項。所以這是錯誤的:

If dr(9).ToString() = "DEMO" Then 
    lvRequests.Items(lvRequests.Items.Count - 1).SubItems(9).Text = "Done" 

' should probably be: 
If dr(9).ToString() = "DEMO" Then 
    lvRequests.Items(lvRequests.Items.Count - 1).SubItems(4).Text = "Done" 

什麼可能使它至少在代碼中更清楚將是使用名稱的子項目。如果實例的子項的對象,而不是使用默認的構造函數,你可以指定一個名稱,並引用他們,而不是這樣:

Dim si As New ListViewItem.ListViewSubItem 
With si 
    .Text = dr(X).ToString  ' dunno whats in there 
    ' this is probably not exactly right, but give the SubItem 
    ' the same name as the db column 
    .Name = dr.Table.Columns(X).ColumnName 
End With 

thisItem.SubItems.Add(si)   ' add sub to Item collection 

現在,你的代碼可以使用名稱,而不是指數:

If dr(9).ToString() = "DEMO" Then 
    lvReq.Items(lvReq.Items.Count - 1).SubItems("TheColumnName").Text = "Done" 

它不再是真正重要的有多少列或子項目。 ListViewItem.SubItems集合不要求子項名稱是唯一的,所以可以用同名的2結束,但如果您正確映射DR/DT/DB,它應該自行處理。

如果LV是綁定到數據源(你沒有說),那麼可能有多少個子項目作爲db/datasource列(從來沒有實際使用LV的方式)。

+0

答案仍然不是100%清楚。它是順水推手。所以我清楚自己的頭腦。在我更新的代碼中,第4列從訪問中的字段9中獲取數據。我的代碼在第4列中顯示正確的數據,但不修改文本,但前面的代碼dr(3)正確修正。 – user1532468

+0

感謝您的額外代碼 - 您添加了4個子項目,最後一個來自'dr(9)',它看起來像一個狀態。但是,在添加** fourth **子項之後,最後一段代碼嘗試將「完成」放入**第九**子項中。試試這個:'.SubItems(LVI.SubItems.Count-1).Text =「Done」' – Plutonix

+0

仍然是一樣的Plutonix。爲什麼這到底是如此困難。 – user1532468