簡體   English   中英

使用未綁定數據更新單元格時,DataGridView 將行移至底部

[英]DataGridView moves rows to bottom when cell is updated with Unbound data

我有一個帶有代碼樣式的 DataGridView,並且正在使用 SQLite 數據庫中的數據
數據庫未綁定到 DataGridView。 當我單擊一行時會觸發許多事件。
首先數據庫更新為今天的日期。
包含該日期的單元格反映了更改。
然后我根據單元格值對列進行排序。 使用此代碼

 dgvLinks.Sort(dgvLinks.Columns(3), ListSortDirection.Ascending)

如果我從填充 DataGridView 的子例程 ViewSearches() 中省略這些代碼行,則該過程按預期工作,沒有問題。

  If rowCount <= 25 Then
     maxRowCount = 25 - rowCount
     For iA = 1 To maxRowCount
        dgvLinks.Rows.Add(" ")
     Next
  End If

如果我使用 ViewSearches() 調用重新填充 DataGridView,我可以使用這些空行
我試圖避免這種設計,因為它似乎過度使用資源。
發生的錯誤是包含數據的 4 行被移動到 DataGridView 的底部,而這 4 行的數據上方是空行。 我將在下面發布相關代碼。
我的問題如何保留空行並填充 DataGridView,以便帶有數據的行位於 DataGridView 的頂部?
這是我選擇 LID 2 后的屏幕截圖。它已更新並冒泡到 DGV 的底部。
數據網格視圖

    Private Sub ViewSearches()

    Dim intID As Integer
    Dim strChannelName As String
    Dim strLinkAddress As String
    Dim strLastVisit As String
    Dim strLinkType As String
    Dim rowCount As Integer
    Dim maxRowCount As Integer
    'Dim emptyStr As String = "  "

    Using conn As New SQLiteConnection($"Data Source = '{gv_dbName}';Version=3;")
        conn.Open()

        Using cmd As New SQLiteCommand("", conn)

            'cmd.CommandText = "SELECT * FROM LinkTable"
            ' Line of CODE Above works with If statement in  While rdr
            '==========================================================
            'cmd.CommandText = "SELECT * FROM LinkTable WHERE ytSiteType = 'News'"

            cmd.CommandText = "SELECT * FROM LinkTable WHERE ytSiteType = @site"
            cmd.Parameters.Add("@site", DbType.String).Value = gvSLT

            Using rdr As SQLite.SQLiteDataReader = cmd.ExecuteReader
                'dgvLinks.DataSource = rdr
                'Statement Above use when DB is bound to dgvLinks
                '=================================================

                While rdr.Read()
                    intID = CInt((rdr("LID")))
                    strChannelName = rdr("ytChannelName").ToString
                    strLinkAddress = rdr("ytLinkAddress").ToString
                    strLastVisit = rdr("ytLastVisit").ToString
                    strLinkType = rdr("ytSiteType").ToString
                    'If strLinkType = gvSLT Then
                    dgvLinks.Rows.Add(intID, strChannelName, strLinkAddress, strLastVisit)
                    rowCount = rowCount + 1
                    'End If
                End While

                dgvLinks.Sort(dgvLinks.Columns(3), ListSortDirection.Ascending)

            End Using

            If rowCount <= 25 Then
                maxRowCount = 25 - rowCount
                For iA = 1 To maxRowCount
                    dgvLinks.Rows.Add(" ")
                Next
            End If

        End Using
    End Using
    'FindEmpty()
End Sub

單擊更新到數據庫的事件

    Private Sub dgvLinks_CellClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvLinks.CellClick

    selRow = e.RowIndex

    If e.RowIndex = -1 Then
        gvalertType = "4"
        frmAlert.ShowDialog()
        Exit Sub
    End If

    'Dim col As DataGridViewColumn = Me.dgvLinks.Columns(e.ColumnIndex)
    Dim row As DataGridViewRow = Me.dgvLinks.Rows(e.RowIndex)
    If row.Cells(2).Value Is Nothing Then
        gvalertType = "5"
        frmAlert.ShowDialog()
        Return
        Exit Sub
    ElseIf gvTxType = "View" Then
        webPAGE = row.Cells(2).Value.ToString()
        siteID = CInt(row.Cells(0).Value.ToString())

        UpdateSiteData()

        ''MsgBox("Stop " & selRow)
        'dgvLinks.ClearSelection()
        'dgvLinks.Refresh()
        'dgvLinks.RefreshEdit()

        Process.Start(webPAGE)

        'dgvLinks.Columns.Clear()

        ''dgvLinks.Rows.Clear()
        ''ViewSearches()


    ElseIf gvTxType = "Delete" Or gvTxType = "Update" Then
        gvID = CInt(row.Cells(0).Value)
        gvSiteName = row.Cells(1).Value.ToString
        gvSiteURL = row.Cells(2).Value.ToString
        frmADE.Show()
        Close()
    End If

End Sub

更新例程

    Public Sub UpdateSiteData()

    Dim dateToday = Date.Today
    dateToday = CDate(CDate(Date.Today).ToString("M-d-yyyy"))

    Using conn As New SQLiteConnection($"Data Source = '{gv_dbName}';Version=3;"),
        cmd As New SQLiteCommand("UPDATE LinkTable SET ytLastVisit = @ytLastVisit WHERE LID =" & siteID, conn)
        conn.Open()

        cmd.Parameters.Add("@ytLastVisit", DbType.String).Value = dateToday.ToString("M-d-yyyy")

        cmd.ExecuteNonQuery()

        dgvLinks.Rows(selRow).Cells(3).Value = dateToday.ToString("M-d-yyyy")

        'Line of code above INSERTS value in Last Visit Column at the correct ROW
        'NOT needed if you reload data from the database
        '=========================================================================
        'dgvLinks.Refresh()
        'dgvLinks.RefreshEdit()

        dgvLinks.Sort(dgvLinks.Columns(3), ListSortDirection.Ascending)

    End Using

End Sub

你會看到一些我嘗試過的東西被注釋掉了。 正如我所說,如果我調用 ViewSearches() 子例程,我可以解決這個問題。

    Private Sub StyleDGV()

    'Sets Design of the DataGridView
    '===============================
    dgvLinks.DefaultCellStyle.Font = New Font("Times New Roman", 13.0F, FontStyle.Bold)
    dgvLinks.ColumnCount = 4
    dgvLinks.Columns(0).Width = 60   'ID
    dgvLinks.Columns(1).Width = 325  'Site Name 325
    dgvLinks.Columns(2).Width = 860  'Site Url 860
    dgvLinks.Columns(3).Width = 154  'LastVisit 140
    'Option with no blank rows increase col count to 5
    'OR increase width of col(3) WHY? because the scroll bar is not showing 
    ' TOTAL Width 1450 Height 488
    '=============================
    'To Set Col Header Size Mode = Enabled
    'To Set Col Header Default Cell Styles DO in Properties
    'dgvLinks.Columns(6).DefaultCellStyle.Format = "c"

    dgvLinks.ColumnHeadersHeight = 10 'Sans Serif 'Tahoma
    dgvLinks.ColumnHeadersDefaultCellStyle.Font = New Font("Sans Serif", 12.0F, FontStyle.Bold)

    dgvLinks.ColumnHeadersDefaultCellStyle.ForeColor = Color.Blue
    dgvLinks.DefaultCellStyle.BackColor = Color.LightGoldenrodYellow

    'DGV Header Names
    dgvLinks.Columns(0).Name = "LID"
    dgvLinks.Columns(1).Name = "Site Name"
    dgvLinks.Columns(2).Name = "Site URL"
    dgvLinks.Columns(3).Name = "Last Visit"

    dgvLinks.Columns(0).SortMode = DataGridViewColumnSortMode.NotSortable
    dgvLinks.Columns(1).SortMode = DataGridViewColumnSortMode.NotSortable
    dgvLinks.Columns(2).SortMode = DataGridViewColumnSortMode.NotSortable
    dgvLinks.Columns(3).SortMode = DataGridViewColumnSortMode.NotSortable

End Sub

任何關注這個問題的人,允許保留空行的修復只是省略了更新到數據庫子例程中的排序命令

至於從 SQLite 數據庫中獲取數據到網格中……您幾乎可以在ViewSearches方法中獲得它。 命令文本看起來不錯; 但是您使用的是SQLiteDataReader 這是訴諸於逐行讀取數據。

我建議您改用SQLiteDataAdapter 有了它,您可以一次性從數據庫中獲取DataTable 首先創建並初始化一個DataSet ,然后創建一個新的SQLiteDataAdapter然后將你的命令添加到數據適配器中,比如......

DataSet ds = new DataSet();

using (SQLiteDataAdapter sqlDA = new SQLiteDataAdapter()) {
  conn.Open();
  sqlDA.SelectCommand = cmd.CommanText;
  sqlDA.Fill(ds, “tableName”);
  if (ds.Tables.Count > 0) {
    //return ds.Tables[“tableName”];
    dgvLinks.DataSource = ds.Tables[“tableName”];
  }
}

如果查詢成功,這將向DataSet ds添加一個名為“tableName”的DataTable

然后只需將該DataTable用作網格的DataSource ......就像......

dgvLinks.DataSource = ds.Tables[“tableName”];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM