2015-11-03 51 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); 

每次調用該方法,將在主面板加載的面板。一切工作正常,如果我沒有滾動滾動條。一旦我將滾動條向下滾動,然後我調用該方法,面板之間的距離就會增加。

按照邏輯寫入,兩個面板之間的距離應該沿着Y軸197個像素,但是會增加更多。

我已經設置AutoScroll=true

任何幫助!

+0

你的代碼將每個新面板的位置後,是前面板位置的197px偏移量。它不會將間距設置爲197px ... –

+0

爲什麼不將margin設置爲197px? –

+0

感謝大家的建議...而不是使用面板我試圖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

謝謝伊萬。 :) –

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