winform中的面板表现错误

时间:2015-11-03 05:26:38

标签: c# winforms panel

我在Winforms中有一个面板,它在方法调用期间加载面板。 在方法调用中,我编写了以下代码:

//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

任何帮助!!!

2 个答案:

答案 0 :(得分: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));  

答案 1 :(得分: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