diablo22 Ответов: 1

Vb проблема со следующим, предыдущим


Привет
У меня есть проблема здесь, что я не могу найти решение, я застрял, так что мне понадобится небольшая помощь, возможно, улучшение моего кода, если это требуется, чтобы быть лучше.

Что я хотел сделать, так это сделать кнопки Next Previous First Last для выбора индекса строки.
И когда я нажимаю на какую-то ячейку, чтобы отобразить мне информацию в текстовых полях, а затем, если я нажимаю кнопку Далее, чтобы перейти к следующей записи или предыдущей.

Мой код теперь делает это:
- Выбор строки по кнопкам был в порядке
- Но если я выберу сейчас какую-то строку случайного примера 3 , то она отобразит мне результат в текстовых полях, но если я нажму кнопку Next Previous не работает правильно, чтобы отобразить информацию и выбор строки.

Вот мой код проекта:
Public Class Form2
    Dim maxRows As Integer
    Dim inc As Integer

Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Using con As New OleDbConnection(ServerStatus)
            Using cmd As New OleDbCommand("SELECT * FROM Table", con)
                cmd.CommandType = CommandType.Text
                Using sda As New OleDbDataAdapter(cmd)
                    Using dt As New DataTable()
                        sda.Fill(dt)

                        'Set AutoGenerateColumns False
                        DataDisplay.AutoGenerateColumns = False
                        'DataDisplay.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
                        DataDisplay.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
                        DataDisplay.AutoResizeColumns()

                        'Set Columns Count
                        DataDisplay.ColumnCount = 6

                        'Add Columns
                        DataDisplay.Columns(0).Name = "ID"
                        DataDisplay.Columns(0).HeaderText = "ID"
                        DataDisplay.Columns(0).DataPropertyName = "ID"

                        DataDisplay.Columns(1).Name = "cName"
                        DataDisplay.Columns(1).HeaderText = "Name"
                        DataDisplay.Columns(1).DataPropertyName = "cName"

                        DataDisplay.Columns(2).Name = "cNumber"
                        DataDisplay.Columns(2).HeaderText = "Number"
                        DataDisplay.Columns(2).DataPropertyName = "cNumber"

                        DataDisplay.Columns(3).Name = "cSupplier"
                        DataDisplay.Columns(3).HeaderText = "Supplier"
                        DataDisplay.Columns(3).DataPropertyName = "cSupplier"

                        DataDisplay.Columns(4).Name = "cStore"
                        DataDisplay.Columns(4).HeaderText = "Store"
                        DataDisplay.Columns(4).DataPropertyName = "cStore"

                        DataDisplay.Columns(5).Name = "cCount"
                        DataDisplay.Columns(5).HeaderText = "Count"
                        DataDisplay.Columns(5).DataPropertyName = "cCount"

                        maxRows = dt.Rows.Count
                        inc = 0

                        TextBox1.Text = dt.Rows(inc).Item(1).ToString
                        TextBox2.Text = dt.Rows(inc).Item(2).ToString
                        TextBox3.Text = dt.Rows(inc).Item(3).ToString
                        TextBox4.Text = dt.Rows(inc).Item(4).ToString
                        TextBox5.Text = dt.Rows(inc).Item(5).ToString
                        TextBox6.Text = dt.Rows(inc).Item(0).ToString

                        DataDisplay.DataSource = dt
                    End Using
                End Using
            End Using
        End Using
        Try
            With cmd
                Dim stream As New IO.MemoryStream()
                conn.Open()
                .Connection = conn
                .CommandText = "select cPicture from Table where ID=@uID"
                .Parameters.Add("@uID", OleDbType.Integer, 50).Value = TextBox6.Text
                Dim image As Byte() = DirectCast(cmd.ExecuteScalar(), Byte())
                stream.Write(image, 0, image.Length)
                Dim bitmap As New Bitmap(stream)
                PictureBox1.Image = bitmap '--->I have used another picturebox to display image from database.
                Label1.Text = "View Image"
                stream.Close()
                .Parameters.Clear()
            End With
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            cmd.Dispose()
            If conn IsNot Nothing Then
                conn.Close()
            End If
        End Try
    End Sub

Private Sub RefreshData()
        Using con As New OleDbConnection(ServerStatus)
            Using cmd As New OleDbCommand("SELECT * FROM Table", con)
                cmd.CommandType = CommandType.Text
                Using sda As New OleDbDataAdapter(cmd)
                    Using dt As New DataTable()
                        sda.Fill(dt)

                        TextBox1.Text = dt.Rows(inc).Item(1).ToString
                        TextBox2.Text = dt.Rows(inc).Item(2).ToString
                        TextBox3.Text = dt.Rows(inc).Item(3).ToString
                        TextBox4.Text = dt.Rows(inc).Item(4).ToString
                        TextBox5.Text = dt.Rows(inc).Item(5).ToString
                        TextBox6.Text = dt.Rows(inc).Item(0).ToString

                        DataDisplay.DataSource = dt
                        Label1.Text = "View Image"
                        'Select row
                        If DataDisplay.RowCount > 0 Then
                            DataDisplay.ClearSelection()
                            DataDisplay.CurrentCell = DataDisplay.Rows(inc).Cells(0)
                            DataDisplay.Rows(inc).Selected = True
                        End If
                    End Using
                End Using
            End Using
        End Using
        Try
            With cmd
                Dim stream As New IO.MemoryStream()
                conn.Open()
                .Connection = conn
                .CommandText = "select cPicture from Table where ID=@uID"
                .Parameters.Add("@uID", OleDbType.Integer, 50).Value = TextBox6.Text
                Dim image As Byte() = DirectCast(cmd.ExecuteScalar(), Byte())
                stream.Write(image, 0, image.Length)
                Dim bitmap As New Bitmap(stream)
                PictureBox1.Image = bitmap '--->I have used another picturebox to display image from database.
                stream.Close()
                .Parameters.Clear()
            End With
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            cmd.Dispose()
            If conn IsNot Nothing Then
                conn.Close()
            End If
        End Try
    End Sub

Private Sub ButtonNext_Click(sender As Object, e As EventArgs) Handles ButtonNext.Click
        If inc <> maxRows - 1 Then
            inc = inc + 1
            RefreshData()
        Else
            MsgBox("No More Rows")
        End If
    End Sub

Private Sub ButtonBack_Click(sender As Object, e As EventArgs) Handles ButtonBack.Click
        If inc > 0 Then
            inc = inc - 1
            RefreshData()
        Else
            MsgBox("First Record")
        End If
    End Sub

Private Sub ButtonFirst_Click(sender As Object, e As EventArgs) Handles ButtonFirst.Click
        inc = 0
        RefreshData()
    End Sub

Private Sub ButtonLast_Click(sender As Object, e As EventArgs) Handles ButtonLast.Click
        inc = maxRows - 1
        RefreshData()
    End Sub

Private Sub DataDisplay_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataDisplay.CellClick
        If e.RowIndex >= 0 Then
            Dim row As DataGridViewRow = Me.DataDisplay.Rows(e.RowIndex)
            TextBox6.Text = row.Cells(0).Value.ToString()
            TextBox1.Text = row.Cells(1).Value.ToString()
            TextBox2.Text = row.Cells(2).Value.ToString()
            TextBox3.Text = row.Cells(3).Value.ToString()
            TextBox4.Text = row.Cells(4).Value.ToString()
            TextBox5.Text = row.Cells(5).Value.ToString()
            'Select row
            Dim intIndex = e.RowIndex
            If inc <> maxRows - 1 Then
                inc = inc + intIndex
            End If
            If DataDisplay.RowCount > 0 Then
                DataDisplay.ClearSelection()
                DataDisplay.CurrentCell = DataDisplay.Rows(inc).Cells(intIndex)
                DataDisplay.Rows(inc).Selected = True
            End If
        End If
    End Sub


Что я уже пробовал:

Отредактированный:
- Я уже решил эту проблему
- Воссоздайте код заново
- Используйте разные методы
- Новый способ кнопок следующая предыдущая фамилия

ZurdoDev

Похоже, что ваша переменная inc может быть установлена неправильно. Просто поместите точку останова в свой код и отладьте его, и вы увидите, что происходит.

1 Ответов

Рейтинг:
1

phil.o

В дополнение к комментарию Зурдодева, который является правильным способом решения такого рода проблем, вы можете отключить соответствующие кнопки, чтобы вам не нужно было проверять текущее значение в ваших обработчиках событий.

Private Sub DataDisplay_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles DataDisplay.SelectedIndexChanged
   Dim index As Integer = DataDisplay.SelectedIndex
   Dim last As Integer = DataDisplay.Items.Count - 1
   ButtonNext.Enabled = ButtonLast.Enabled = index > -1 AndAlso index < last
   ButtonBack.Enabled = ButtonFirst.Enabled = index > 0
End Sub

Private Sub ButtonNext_Click(ByVal sender As Object, Byval e As EventArgs) Handles ButtonNext.Click
   DataDisplay.SelectedIndex += 1
End Sub

Private Sub ButtonLast_Click(ByVal sender As Object, Byval e As EventArgs) Handles ButtonLast.Click
   DataDisplay.SelectedIndex = DataDisplay.Items.Count - 1
End Sub

Private Sub ButtonBack_Click(ByVal sender As Object, Byval e As EventArgs) Handles ButtonBack.Click
   DataDisplay.SelectedIndex -= 1
End Sub

Private Sub ButtonFirst_Click(ByVal sender As Object, Byval e As EventArgs) Handles ButtonFirst.Click
   DataDisplay.SelectedIndex = 0
End Sub

При этом нет необходимости проверять текущий выбранный индекс в обработчиках событий кнопок, так как кнопки будут включены только в том случае, если им это необходимо.


diablo22

Итак, вы имеете в виду, что мне не нужно использовать inc во всем источнике, но теперь мой вопрос заключается в том, использую ли я selectedindexchange. Например, если я запускаю программу и не касаюсь datagridview, а непосредственно нажимаю кнопку next record, чтобы показать, как она будет считываться, чтобы перейти к следующей строке? извините за глупый вопрос просто нужно понять логику :)

phil.o

Если строка не выбрана, выбранный индекс будет равен -1. С помощью кода, который я написал, ни одна кнопка не будет включена. Вы можете изменить логику, чтобы сделать ее такой, какую сочтете подходящей.
И, да, в принципе, я думаю, что вам не нужны переменные класса inc и maxRows.

diablo22

DataDisplay_SelectedIndexChanged у меня нет SelectedIndexChanged только SelectionChanged, Datagridview этого не имеет

diablo22

Во всяком случае мне удалось сделать это другим способом и перестроить код всего :)