В моем случае (пере) сортировка сетки помогла. Попробуйте что-то вроде этого:

я есть winform в vs2008, который содержит DataGridView. Сетка данных содержит список с несколькими столбцами. Это фиксированная ширина, за исключением той, которую я настроил, чтобы занять оставшееся пространство и заполнить ширину вида. Размер winform можно изменять во всех направлениях.

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

Это вообще возможно достичь? И, если это так, как сделать так, чтобы вертикальная полоса прокрутки всегда была видна?

Ответы на вопрос(2)

Решение Вопроса

ScrollBar VisibleChanged. Там вы должны иметь возможность установить для свойства Visible значение True, переопределяя поведение по умолчанию.

Как-то так, я думаю ...

public class SubclassedDataGridView : DataGridView
    {
        public SubclassedDataGridView (): base()
        {
            VerticalScrollBar.VisibleChanged += new EventHandler(VerticalScrollBar_VisibleChanged);
        }

        void VerticalScrollBar_VisibleChanged(object sender, EventArgs e)
        {
            VerticalScrollBar.Visible = true;
        }
     }
 gkrogers23 янв. 2009 г., 14:23
Потому что вы переопределяете событие VisibleChanged. Если вы установите полосу прокрутки, видимую при загрузке, но затем она изменит свой размер и решит, что ей не нужна вертикальная полоса прокрутки, она исчезнет, ​​но это событие сработает, после чего вы переопределите свойство и (надеюсь) вуаля!
 Sakkle23 янв. 2009 г., 14:28
Ахааааа ... спасибо :)
 sɐunıɔןɐqɐp25 июл. 2017 г., 21:04
К сожалению, это решение не сработало для меня. У меня есть StackOverflowException, так как установка Visibility запускает другое событие VisibleChanged. И мы на самом деле не перезаписываем ни одно событие, мы просто подписываем дополнительный обратный вызов на это событие. Исходные обратные вызовы, подписанные базовым классом, все еще называются ПОСЛЕ обратного вызова производного класса. Я не нашел способа пометить это событие как «обработанное».
 gkrogers23 янв. 2009 г., 14:39
Y'welcome! У меня была небольшая игра, и она, кажется, работает, оставаясь видимой, но затемненной, когда она не нужна, но похоже, что вам, возможно, придется самостоятельно устанавливать высоту полосы прокрутки.
 Sakkle23 янв. 2009 г., 14:16
Хорошо ... Итак, я понимаю, что вы здесь делаете, однако я уже попытался установить полосу прокрутки, видимую в DataGridView. Почему это должно заставить его вести себя по-другому?

этого:

 if (gridName.SortedColumn == null)
   gridName.Sort(gridNameColumns[columnName],ListSortDirection.Ascending);
 else
 {
    ListSortDirection dir;
    if (gridName.SortOrder == SortOrder.Descending) 
       dir = ListSortDirection.Descending;
    else dir = ListSortDirection.Ascending;

    gridName.Sort(gridName.SortedColumn, dir);
 }

Ваш ответ на вопрос