Как обнаружить вертикальную полосу прокрутки в элементе управления DataGridView - PullRequest
8 голосов
/ 21 апреля 2010

Использование winforms в vs2008.У меня есть DataGridView, и я хотел бы определить, когда вертикальная полоса прокрутки видна.Какое событие я должен зарегистрировать?

Я добавляю суммирование значения каждой ячейки в последнем столбце сетки и отображаю это значение в текстовом поле в нижней части DataGridView.

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

Ответы [ 7 ]

22 голосов
/ 14 октября 2011
var vScrollbar = dataGridView1.Controls.OfType<VScrollBar>().First();
if (vScrollbar.Visible)
{
}
8 голосов
/ 21 апреля 2010

Преобладающим поведением DGV обычно является сильная боль в шее.Все получилось довольно быстро.Добавьте новый класс в форму и вставьте код, показанный ниже.Компиляция.Перетащите новый элемент управления с верхней части панели инструментов на форму.Реализуйте событие ScrollbarVisibleChanged.

using System;
using System.Windows.Forms;

class MyDgv : DataGridView {
    public event EventHandler ScrollbarVisibleChanged;
    public MyDgv() {
        this.VerticalScrollBar.VisibleChanged += new EventHandler(VerticalScrollBar_VisibleChanged);
    }
    public bool VerticalScrollbarVisible {
        get { return VerticalScrollBar.Visible; }
    }
    private void VerticalScrollBar_VisibleChanged(object sender, EventArgs e) {
        EventHandler handler = ScrollbarVisibleChanged;
        if (handler != null) handler(this, e);
    } 
}
1 голос
/ 27 августа 2014

Вместо использования Linq (Адам Батлер) вы можете просто пройтись по элементам управления и зарегистрировать обработчик событий, который будет вызываться при каждом изменении видимости полосы прокрутки. Я реализовал это таким образом, и он работает довольно гладко:

private System.Windows.Forms.DataGridView dgCounterValues;
private Int32 _DataGridViewScrollbarWidth;

// get vertical scrollbar visibility handler
foreach (Control c in dgCounterValues.Controls)
if (c.GetType().ToString().Contains("VScrollBar"))
{
    c.VisibleChanged += c_VisibleChanged;
}

сделать это где-нибудь после InitializeComponent () В обработчике делайте все, что вам нужно, в ответ на изменение видимости вертикальной полосы прокрутки. То же самое работает для горизонтальной полосы прокрутки (замените VScrollBar на HScrollBar):

void c_VisibleChanged(object sender, EventArgs e)
{
    VScrollBar vb = sender as VScrollBar;
    if (vb.Visible) _DataGridViewScrollbarWidth = vb.Width;
    else _DataGridViewScrollbarWidth = 0;
} 
0 голосов
/ 09 мая 2014

Установите для свойства "AutoSizeMode" последнего столбца DGV значение "Заполнить" и установите для свойства Width TextBox значение, равное dgv.Columns ["lastcolumn"]. Width.

0 голосов
/ 25 марта 2014

Если ваш dgv находится внутри панели, вы можете сравнить свойства панели и dgv height. Если значение dgv больше, чем на панели, тогда должна быть полоса прокрутки, верно?

Как:

int panel_height = pnl.Height;
int dgv_height = (dgv.RowCount + 1) * 24; // You can play around with this 24 according to your cell styles
if (dgv_height > panel_height) MessageBox.Show("Voila!");
0 голосов
/ 22 апреля 2010

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

  /// <summary>
  /// Horizontally shifts the label and text boxes that display the total
  /// values so that the totals remain aligned with the columns.
  /// </summary>
  private void ShiftTotalsDisplay(DataGridView grid, Label firstLabel,
     TextBox secondTextBox, TextBox thirdTextBox)
  {         
     //Note if you have a rowheader add the width here also.
     int nameRightLoc = grid.Location.X +            
        grid.Columns[0].Width;
     int fpRightLoc = nameRightLoc +
        grid.Columns[0].DividerWidth +
        grid.Columns[1].Width;
     int dlRightLoc = fpRightLoc + 
        grid.Columns[1].DividerWidth +
        grid.Columns[2].Width;

     Point loc = firstLabel.Location;
     loc.X = nameRightLoc - firstLabel.Width - 2;
     firstLabel.Location = loc;

     loc = secondTextBox.Location;
     loc.X = fpRightLoc - secondTextBox.Width - 2;
     secondTextBox.Location = loc;

     loc = thirdTextBox.Location;
     loc.X = dlRightLoc - thirdTextBox.Width - 2;
     thirdTextBox.Location = loc;         
  }
0 голосов
/ 21 апреля 2010

Я думаю, что нет события для этого ... но вы можете попробовать что-то подобное во всех местах, где может расти сетка:

  • Получить количество фактических строк в сетке + заголовок
  • Умножьте это число на высоту каждой строки
  • Если результат больше высоты DataGrid, должна быть вертикальная полоса прокрутки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...