【问题标题】:Panel in winform behaving wronglywinform中的面板行为错误
【发布时间】:2016-02-03 04:22:02
【问题描述】:

我在 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

任何帮助!!!

【问题讨论】:

  • 您的代码将每个新面板的位置设置为前一个面板位置的 197 像素偏移。它没有将间距设置为 197px...
  • 为什么不将边距设置为 197px?
  • 感谢大家的建议...我尝试了 FlatLayoutPanel 而不是使用 Panel,它的工作原理很吸引人...无需设置内部面板位置和所有...

标签: c# winforms panel


【解决方案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));  

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      相关资源
      最近更新 更多