2013-06-12 4 views
8

http://i.stack.imgur.com/SewpO.png Я пытаюсь построить форму макет, который будет отвечать следующим требованиям:три панели макета по форме

  • panel1 имеет фиксированную высоту - он будет содержать только ярлык, который будет своего рода заголовок с заголовком и т. д.
  • panel2 будет содержать datagridview с заполнением докстафа, здесь пользователь найдет объекты, которые он может выбрать, чтобы показать свои свойства.
  • panel3 фиксированная высота - он будет расположен в нижней части формы и будет содержать свойства выбранного объекта из datagridview

Моя проблема состоит в том, чтобы сделать панель2 заполнить все место, которое осталось после панели 1 и панели3. Так что если panel1 и panel3 имеют фиксированную высоту 100, а форма имеет высоту 500, тогда панель2 должна иметь 300 высоты, если форма будет изменена до 600, тогда панель2 также должна измениться до 400 и т. Д.

Я пытался некоторые комбинации док-станций, пытаясь установить док-станцию ​​panel1 как верх, панель3 как нижняя и панель2 как заполнять, но дает другие результаты, чем ожидалось. Я знаю, что могу обработать событие изменения размера и изменить размер панели2 до размера, который уйдет, но мне интересно, есть ли еще более эластичный и чистый способ сделать это.

+0

Каковы результаты, которые вы получаете? – JeremyK

+0

В чем проблема с панелью 1 = DockTop, Panel3 = DockBottom и Panel2 = Заполнить? – Steve

+0

Это winforms или приложение wpf? – Chepene

ответ

6

Место для стыковки связано с порядком объектов на вашей форме, как упомянуто im_a_noob. Вы можете изменить z-порядок объекта, чтобы изменить способ их стыковки. Вы должны щелкнуть правой кнопкой мыши на панели, которая должна заполнить пространство посередине, а затем выберите «Привести к фронту» в меню. Это должно заставить его правильно заполнить пространство и всю форму за другими панелями.

Итак, вы должны состыковать верхнюю панель с нижней, нижней панелью, а затем с центральной на «Заполнить». Затем щелкните правой кнопкой мыши и выведите центр на передний план.

+0

Это отлично сработало для меня, я начал с этого, не пытался его решить, привязывая, поэтому я не могу сказать, работает ли он. Большое спасибо! – Banzai

4

Это из-за структуры документа.

пойти

View -> Other Windows -> Document Outline (or ctrl + w, u) 

убедитесь, что заполнение док-панелью (средний) является первой из 3 панеле в этом списке. Это должно исправить вас.

0

Просто установите панели 1 якорь как сверху, влево, вправо; панели 2 анкеры должны быть сверху, снизу, слева, справа; панель 3 анкера нижней, левой, правой. Это гарантирует, что верхняя панель остается на месте, нижняя часть движется вниз, а окно будет расширяться.

0

Во-первых, Dock панели 1 и 3 (панель 1 вверх, панели 3 вниз):

top

После того как эти два установлены, выберите Панель 2 и установить его для заполнения:

fill

UPDATE:

Вот быстрый кусок о е код, который я сделал, чтобы проверить ваши панели в правильном порядке в вашем коде:

screenshot

public partial class PanelForm : Form { 

    public PanelForm() { 
    InitializeComponent(); 
    int iHead = Controls.GetChildIndex(panelHead); 
    int iData = Controls.GetChildIndex(panelData); 
    int iFoot = Controls.GetChildIndex(panelFoot); 
    if ((iHead < iData) || (iFoot < iData)) { 
     panelHead.Dock = DockStyle.None; 
     panelData.Dock = DockStyle.None; 
     panelFoot.Dock = DockStyle.None; 
     Controls.SetChildIndex(panelData, 0); 
     Controls.SetChildIndex(panelHead, 1); 
     Controls.SetChildIndex(panelFoot, 2); 
     panelData.Dock = DockStyle.Fill; 
     panelHead.Dock = DockStyle.Top; 
     panelFoot.Dock = DockStyle.Bottom; 
    } 
    ShowData(DateTime.Now); 
    } 

    private void ShowData(DateTime now) { 
    var table = new DataTable(); 
    var c1 = table.Columns.Add("Name", typeof(string)); 
    var c2 = table.Columns.Add("Even", typeof(bool)); 
    var c3 = table.Columns.Add("Index", typeof(int)); 
    var c4 = table.Columns.Add("Times 2", typeof(int)); 
    var c5 = table.Columns.Add("Inverse", typeof(double)); 
    var c6 = table.Columns.Add("Timespan", typeof(TimeSpan)); 
    var c7 = table.Columns.Add("Binary Time", typeof(long)); 
    var c8 = table.Columns.Add("Display", typeof(string)); 
    for (int i = 0; i < 1000; i++) { 
     DataRow r = table.NewRow(); 
     r[c1] = string.Format("Row {0}", i); 
     r[c2] = (i % 2 == 0); 
     r[c3] = i; 
     r[c4] = 2 * i; 
     r[c5] = (0 < i) ? 1/(double)i : double.NaN; 
     r[c6] = DateTime.Now - now; 
     r[c7] = DateTime.Now.ToBinary(); 
     r[c8] = string.Format("{0:g}", DateTime.Now); 
     table.Rows.Add(r); 
    } 
    dataGridView1.DataSource = table; 
    } 

} 
+0

Этого не достаточно. Если z-порядок панелей неправильный, вы не получите ожидаемых результатов. См. Im_a_noob и мои ответы о том, как это исправить. – Tombala

+0

Итак, я написал фрагмент кода, чтобы проверить, что панели находятся в правильном порядке (см. Обновление). – jp2code

+0

Зачем это делать в коде, когда вы можете исправить это через дизайнера? – JeremyK

1

Похоже, TableLayoutPanel будет хорошим выбором здесь. Таким образом, у вас есть возможность устанавливать абсолютные значения для строки 1 (панель 1) и строки 3 (панель 3), а затем использовать 100% для средней строки (панель 2), гарантируя, что она займет оставшееся пространство без перекрытия другого панели.

После того, как вы разместите свой datagridview в средней строке таблицыLayoutPanel, вы должны будете установить свойство Dock для заполнения, и оно должно работать правильно.

Таблицы TableLayoutPanels позволяют размещать только один элемент в ячейке, однако вы можете обойти это, добавив панель в качестве основного элемента, а затем настройте все на этой панели.

Смежные вопросы