2016-06-16 7 views
1

Я в процессе написания приложения Windows Forms, которое использует два вложенных SplitContainers с DataGridViews в двух из трех доступных областей, как показано на следующем изображении. Я подключил настройки и сформировал инициализацию, чтобы разрешить пользователю отключать многоуровневые форматы в пользу однопанельного представления, состоящего только из первого DataGridView.Принуждение DataGridView для заполнения свободного места в SplitContainer

Основная проблема здесь (как я объясню в (надеюсь) достаточной глубине), заключается в том, что DataGridView не придерживаются ограничений панелей SplitContainer, если другие панели скрыты.

DataGridView/SplitContainer layout

Здесь красный контур указывает родительский SplitContainer, называется masterSplitContainer соответствующим образом в ссылках. Синий контур показывает ребенка SplitContainer под названием bottomSplitContainer, занимая позицию masterSplitContainer.Panel2.

DataGridViews занимает оба masterSplitContainer.Panel1 и bottomSplitContainer.Panel1 области, и я разработал код инициализации до сих пор так, что программа учитывает три возможности:

  1. пользователь хочет с одной панелью только вида/UI, что делает masterSplitContainer.Panel1 занимают всю площадь masterSplitContainer.
  2. Пользователь разрешает компоновку с двумя панелями, но удаляет панель 2 нижнего контейнера.
  3. Пользователь хочет все три панели.

Как показал мой тест, только с SplitContainers, второй SplitContainer (ребенок) получил намеченную точку и был совершенно доволен этой договоренностью, без каких-либо помех. Тем не менее, если настройки для того, чтобы однослойных просмотров тестируются, вот результат:

DataGridView issues 1

masterSplitContainer.Panel2 отключается со следующим кодом:

masterSplitContainer.Panel2Collapsed = true; 
masterSplitContainer.Panel2.Hide(); 

В этом случае, я бы как DataGridView, чтобы принять полную рабочую область masterSplitContainer, вместо того, чтобы сохранить свои предопределенные границы, которые были установлены просто потому, что именно там был разветвитель панели, когда я добавил эту часть.

Для процесса устранения то же самое происходит со вторым DataGridView, размещенным в дочернем SplitContainer (то есть bottomSplitContainer.Panel1) - он также не подчиняется области своего приложения.

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

Кроме того, если вам нужны более актуальные ссылки на код, я рад опубликовать класс формы по запросу.

+0

Являются ли DGVs Dock = Fill? Является ли вложенная док-станция SpliContainer Dock = Fill? – TaW

+0

@TaW, делающий эти два изменения, приводит к тому, что элементы выполняют по назначению. – ecfedele

+1

Создание одного cotrol fiil другого просто. Подсказка: сделать больше, чем один, сделать то же самое, добавив один или несколько фиксированных разделителей. – TaW

ответ

0

Попробуйте это:

Добавьте следующий метод:

public static void DoubleBuffered(this DataGridView dgv, bool setting) 
    { 
     Type dgvType = dgv.GetType(); 
     PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", 
      BindingFlags.Instance | BindingFlags.NonPublic); 
     if (pi != null) pi.SetValue(dgv, setting, null); 
    } 

Назовите это так:

dataGridView1.DoubleBuffered(true); 

dataGridView1 имеет быть один в вашем splitpanel.