Вертикальная полоса прокрутки DataGridView не обновляется должным образом (ошибка форм?) - PullRequest
17 голосов
/ 26 декабря 2011

Я столкнулся с ошибкой (я полагаю) в .NET 3.5.При добавлении строк в DataGridView с использованием Rows.Add (), когда DGV отключен, вертикальная полоса прокрутки не обновляется должным образом.Следовательно, после повторного включения DGV невозможно прокрутить полностью до нижней части DGV с помощью полосы прокрутки или колесика мыши (хотя навигация с помощью клавиш со стрелками все еще работает.)

Поэтому я ищуобходной путь.Есть ли способ заставить полосу прокрутки обновить свои границы или вы можете вручную ввести новое максимальное значение?Я бы предпочел не заполнять DGV.

*) На самом деле родительская форма отключена, но я предполагаю, что проблема в том, что она распространяется на элемент управления DGV.

Ответы [ 13 ]

0 голосов
/ 03 февраля 2014

Я хотел бы добавить комментарий к исходному сообщению, но пока не могу (репутация ниже 50).

Я столкнулся с той же проблемой при удалении строк. Полоса прокрутки выглядит отключенной, ползунок не виден, а стрелки серого цвета.
Попробуем обходные пути, описанные здесь, и по этой ссылке (явно включите полосы прокрутки снова) или просто оставьте весь DGV включенным.
Кроме того, эта ссылка предлагает тот же обходной путь (явно включающий ...) и называет его работающим.

0 голосов
/ 24 декабря 2013

Было отмечено, что, когда ширина и высота DataGridView1 сравнивались с шириной и высотой формы, а ширина и высота сбрасывались, если они превышали размеры формы, полосы прокрутки становились видимыми.

Попробуйте следующий код, который будет динамически добавлять элемент управления DataGridView в форму и создавать квадратную сетку с именами заголовков строк и столбцов:

  Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        'Following code adds a Datagridview control to a Form dynamically
        'Step 1.  Add a textbox to a Form, and input the number of columns (ncol). (Note: in this example, ncol=nrow).   
        'Step 2.  Set the Form's Windowstate property to Maximized
        For Each cont As Control In Me.Controls 'remove DataGridView if it already exists on the Form
            If TypeOf (cont) Is DataGridView Then
                Me.Controls.Remove(cont)
            End If
        Next
        Dim DataGridView1 As New DataGridView 'create new data grid view dynamically during run-time
        Me.Controls.Add(DataGridView1) 'add the data grid view to the Form
        Me.Refresh()
        Dim i, nrow, ncol As Integer ' ncol=nrow -->this is a square grid
        ncol = TextBox1.Text
        nrow = ncol 'Note: add a second textbox to the form and input nrow if you don't want a square grid
        DataGridView1.Visible = True
        DataGridView1.Top = 100
        DataGridView1.Left = 100
        DataGridView1.Rows.Clear()
        Do While DataGridView1.Columns.Count > 0
            DataGridView1.Columns.RemoveAt(DataGridView1.Columns.Count - 1)
        Loop
        For i = 1 To ncol
            DataGridView1.Columns.Add(i, "V" & i)
        Next
        DataGridView1.Width = ncol * 115
        DataGridView1.Height = nrow * 22 + 45
        If DataGridView1.Width > Me.Width - DataGridView1.Left Then DataGridView1.Width = Me.Width - DataGridView1.Left - 20
        If DataGridView1.Height > Me.Height - DataGridView1.Top Then DataGridView1.Height = Me.Height - DataGridView1.Top - 50
        DataGridView1.ScrollBars = ScrollBars.None
        For i = 1 To nrow
            DataGridView1.Rows.Add()
            DataGridView1.Rows.Item(i - 1).HeaderCell.Value = "V" & i
        Next
        DataGridView1.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders)
        Dim dgvColumnHeaderStyle As New DataGridViewCellStyle()
        dgvColumnHeaderStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
        DataGridView1.ColumnHeadersDefaultCellStyle = dgvColumnHeaderStyle
        DataGridView1.AllowUserToAddRows = False
        DataGridView1.ScrollBars = ScrollBars.Both
        Me.WindowState = FormWindowState.Maximized
    End Sub
0 голосов
/ 26 декабря 2011

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

int x = Rows.Add();
Rows.RemoveAt(x);

И тогда полоса прокрутки обновится.Но это не очень красиво, это вызывает раздражающее небольшое мерцание, и это может вызвать некоторые события, которые я бы намеренно проигнорировал.Я оставлю вопрос открытым в надежде на лучшее решение.

...