Вместо использования 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;
}