2015-11-03 3 views
1

У меня есть панель в Winforms, которая загружает в нее панели во время вызова метода. В вызове метода я написал следующий код:Панель в winform ведет себя неправильно

//to get number of panel present in main panel so that new panel position can be set 
int counT = panel1.Controls.Count; 

Panel p = new Panel(); 
p.Location = new Point(3, 3 + (counT * 197)); 
p.Size = new Size(280, 150); 

//To add panel to parent panel 
panel1.Controls.Add(p); 

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

Согласно логике, расстояние между двумя панелями должно составлять 197 пикселей вдоль оси Y, но оно увеличивается больше.

Я поставил AutoScroll=true

Любая помощь !!!

+0

Вашего кода устанавливает местоположение каждой новой панели для должно быть смещено на 197 пикселей по сравнению с местоположением предыдущей панели. Он не устанавливает интервал между 197px ... –

+0

Почему вы не устанавливаете марж справа на 197px? –

+0

Спасибо всем за предложение ... Вместо того, чтобы использовать Panel, я попробовал FlatLayoutPanel, и он работал как шарм ... Не нужно устанавливать местоположение внутренней панели и все ... –

ответ

1

Это довольно странное поведение, которое я до сих пор не знал (и у меня много опыта в WF). Это можно увидеть, когда родительская панель прокручивается, когда выполняется код выше. Я думал, что контрольные позиции ребенка относятся к ClientRectangle, но оказывается, что они учитывают DisplayRectangle.

Вскоре вместо этого

p.Location = new Point(3, 3 + (counT * 197)); 

использования этого

var parentRect = panel1.DisplayRectangle; 
p.Location = new Point(parentRect.X + 3, parentRect.Y + 3 + (counT * 197)); 
+0

Спасибо Ivan. :) –

1

Panel.AutoScrollPosition влияет Location свойство всех дочерних элементов управления. Прокрутка работает таким образом. Таким образом, вы должны иметь в виде, что, например, вы можете сохранить текущую позицию прокрутки, переместить позицию (0,0), добавлять новые элементы управления, а также восстановить позицию прокрутки после все

//to get number of panel present in main panel so that new panel position can be set 
int counT = panel1.Controls.Count; 
var pos = this.panel1.AutoScrollPosition; // Whe are storing scroll position 
this.panel1.AutoScrollPosition = new Point(Size.Empty); 
Panel p = new Panel(); 
p.Location = new Point(3, 3 + (counT * 197)); 
p.Size = new Size(280, 150); 
p.BorderStyle = BorderStyle.FixedSingle; 


//To add panel to parent panel 
panel1.Controls.Add(p); 
this.panel1.AutoScrollPosition = new Point(Math.Abs(pos.X), Math.Abs(pos.Y)); // We are restoring scroll position 
Смежные вопросы