2017-07-05 135 views
-1

我想刪除我的listview中的重複項。這裏是我的代碼:ListView中的重複項目vb.net 2008

Imports System.Data.OleDb 
Public Class frmQuizSelector 

Private Sub cmdExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdExit.Click 
    Me.Hide() 
End Sub 

Private Sub lvwQuizzes() 
    With Me.lvwListOfQuizzes 
     .FullRowSelect = True 
     .GridLines = False 
     .View = View.Details 
     .Columns.Add("QuizID", 1) 
     .Columns.Add("Quiz Title", 268) 
    End With 
End Sub 

Private Sub frmQuizSelector_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Me.cmdPrevQ.Visible = False 
    Me.cmdNextQ.Visible = False 

    lvwQuizzes() 

    Try 
     Dim dtb As New DataTable 
     Dim strSql As String = "SELECT * FROM tblQuestions" 
     AConn.Open() 
     Using dataadapter As New OleDbDataAdapter(strSql, AConn) 
      dataadapter.Fill(dtb) 
     End Using 
     AConn.Close() 
     Me.lvwListOfQuizzes.Items.Clear() 
     Dim i As Integer = 0 
     For i = 0 To dtb.Rows.Count - 1 
      Dim lv As New ListViewItem 
      lv.Text = dtb.Rows(i).Item("QuizID1") 
      lv.SubItems.Add(dtb.Rows(i).Item("QuizTitle")) 
      lv.SubItems.Add(dtb.Rows(i).Item("CourseSubject")) 
      lv.SubItems.Add(dtb.Rows(i).Item("QuestionNumber")) 
      lv.SubItems.Add(dtb.Rows(i).Item("ActualQuestion")) 
      lv.SubItems.Add(dtb.Rows(i).Item("Answer1")) 
      lv.SubItems.Add(dtb.Rows(i).Item("Answer2")) 
      lv.SubItems.Add(dtb.Rows(i).Item("Answer3")) 
      lv.SubItems.Add(dtb.Rows(i).Item("Answer4")) 
      Me.lvwListOfQuizzes.Items.Add(lv) 
     Next 
    Catch ex As Exception 
     MsgBox(ex.Message) 
     AConn.Close() 
    End Try 
End Sub 


Private Sub lvwListOfQuizzes_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lvwListOfQuizzes.Click 
    Me.cmdNextQ.Visible = True 

    Try 
     Dim strSql As String = "SELECT * FROM tblQuestions WHERE [QuizID1] = " & lvwListOfQuizzes.SelectedItems(0).SubItems(0).Text & "" 
     Dim dtb As New DataTable 
     AConn.Open() 
     Using dataadapter As New OleDbDataAdapter(strSql, AConn) 
      dataadapter.Fill(dtb) 
     End Using 
     AConn.Close() 
     For Each row As DataRow In dtb.Rows 
      Me.lblQuizName.Text = row("QuizTitle").ToString() 
      Me.lblCourseSubject.Text = row("CourseSubject").ToString() 
      Me.lblQNum.Text = row("QuestionNumber").ToString() 
      Me.lblQuestion.Text = row("ActualQuestion").ToString() 
      Me.lblA.Text = row("Answer1").ToString() 
      Me.lblB.Text = row("Answer2").ToString() 
      Me.lblC.Text = row("Answer3").ToString() 
      Me.lblD.Text = row("Answer4").ToString() 
     Next 
    Catch ex As Exception 
     MsgBox(ex.Message) 
     AConn.Close() 
    End Try 
End Sub 

上面的代碼在我的列表視圖中生成重複項。例如,我在我的數據庫中有五個測驗題目說「國家」(每個題目附有不同的問題),我的列表視圖顯示了所有五個相同的題目。我只需要它來只顯示一個,因爲它只是一個測驗題

+0

您通常會如何防止將重複項添加到列表中?當您有要添加的項目時,您可以將其與列表中已有的每個項目進行比較,並且當且僅當您找不到匹配時才添加它。這種情況與此完全相同。考慮一下,拿起筆和紙,寫下你需要執行的步驟,然後嘗試編寫代碼來實現這些步驟。如果你在做這件事的時候遇到了問題,那麼THEN會是在這裏發表問題的時候。編程不存在於真空中。你如何在「現實生活」中做事情通常是你在編程時如何做。 – jmcilhinney

+0

將項目添加到數組中,使用Linq Distinct過濾掉重複的項目,然後將它們添加到您的ListView https://msdn.microsoft.com/zh-cn/library/bb348436(v=vs.110).aspx – Werdna

回答

0

你可以做到這一點,

由於數據被倒入一個ListView之前分配給數據行,我會建議防止重複訪問行,而不是隨時將數據注入到列表視圖中,從而長時間研究數據。

Dim lastrow As DataRow 
Sub tbnewrow(Objet As DataTable, e As DataRowChangeEventArgs) 
     If (e.Action = DataRowAction.Commit) Then 
      If (Objet.Rows.IndexOf(lastrow) > 0 AndAlso e.Row.Item(1) = Objet.Rows(Objet.Rows.IndexOf(lastrow)).Item(1)) Then 
       e.Row.Item(1) = "" 
      Else 
       lastrow = e.Row 
      End If 
     End If 
End Sub 

這可以確保第二列沒有重複的行,所有行都在一次加載中重複裝載。

現在只需將此事件綁定到您的數據表。

Dim dtb As New DataTable 
AddHandler dtb .RowChanged, AddressOf tbnewrow 

在此之後,您可能更願意使用datagrid而不是listview,這樣可以節省更多的時間。

+0

嘿,謝謝。如果已經解決了:) – yourhaven10