c#带自动滚动的面板 - 控制焦点上的Srollbar位置重置

时间:2012-02-16 07:10:11

标签: c# winforms

这适用于Windows窗体。

Panel有AutoScroll = True

我将面板动态添加到主面板,最终超出主面板显示矩形。 然后将标签,组合框和文本框添加到添加的面板中。

如果我选择一个组合框或文本框,它会将主面板滚动条位置重置为0,并且组合框的下拉菜单也将放置在屏幕X,Y上,如果滚动条没有复位。

我正在考虑在选择控件时保存滚动位置。测试后,似乎滚动位置还没有重置,所以我可以在这里捕获它。然后在希望面板的某些事件上恢复滚动位置。 我正在努力找出我将用于恢复滚动位置的确切事件。我也希望当我这样做时,下拉菜单会被放置在正确的x,y上。

更好的解决方案是基于面板控件创建自定义控件并可能覆盖事件?这样,每次使用滚动面板时,我都不需要保存滚动位置,从而使我的项目变得杂乱无章。

2 个答案:

答案 0 :(得分:32)

我找到了我在这里遇到的问题的答案: Answer

public class CustomPanel : System.Windows.Forms.Panel
{
    protected override System.Drawing.Point ScrollToControl(System.Windows.Forms.Control activeControl)
    {
        // Returning the current location prevents the panel from
        // scrolling to the active control when the panel loses and regains focus
        return this.DisplayRectangle.Location;
    }
}

答案 1 :(得分:1)

谢谢,除非我必须调整底部面板的填充,否则这很有效。只是对可能看到一些抵消的其他人的一个FYI。

protected override System.Drawing.Point ScrollToControl(System.Windows.Forms.Control activeControl)
{
    Point retPt = DisplayRectangle.Location;
    retPt.Offset(new Point(-1*Padding.Left, -1*Padding.Bottom));

    return retPt;
}