为什么单击文本框会导致AutoScroll面板滚动回到顶部?

在C#应用程序中完成一个注册表单,我注意到如果我启用了AutoScroll,然后在滚动下方有一个文本框并点击它,它会一直跳到顶部。 有没有办法用一些代码解决这个问题或者它是否合适?

我用文字解释它有点困难,所以这是一个显示行为的简短video 。

我曾经也有过一样的问题。 我在我的面板中使用此代码修复了它:

protected override Point ScrollToControl(Control activeControl) { return this.AutoScrollPosition; } 

我遇到了这个问题。 我不得不从表格上的面板上移除对接,这解决了问题。

由于以前显然没有人见过这种行为并且可以提供快速回答,因此我打开了Visual Studio来尝试重现您描述的内容。

我创建了一个新的WinForms项目,其中GroupBox包含一个PanelAutoScroll属性设置为“True”。 然后,我在Panel添加了两个新的GroupBox控件,每个控件包含两个TextBox控件。 第一个嵌入式GroupBox位于表单的顶部,在启动时完全可见; 第二个嵌入式GroupBox位于底部,必须滚动到视图中。 这相当于您从描述和video中可以看出的最佳设计/布局。

但是,当我运行项目时,向下滚动到第二个嵌入的GroupBox并选择它包含的一个TextBox控件,它完全按预期执行。 我单击的TextBox控件获得焦点, 而不会将整个面板向上滚动到顶部。 我似乎无法重现你所看到的。 如果您可以告诉我在设计测试样本时遇到了什么问题,或者发布了重新创建您所遇到的行为所需的最小样本项目,我可能会提供帮助。

否则,以下是一些需要调查的建议:

  1. 表单上对象的Tab键顺序。 这实际上不应该导致所描述的行为,因为单击控件应该将焦点设置为该控件,无论其在Tab键顺序中的位置如何,并且在我的示例项目中多次拼写Tab键顺序仍然不会出现有同样的效果。 但我认为无论如何都值得一试。 在设计模式下,转到“查看”菜单,然后单击“选项卡顺序”。 您可以设置Tab键顺序的所有控件在其左上角都有一个彩色小框,表示每个容器中的Tab键顺序。 要设置Tab键顺序,请按照您希望它们聚焦的自然顺序单击每个控件。

  2. 搜索任何.Focus语句的代码。 确保您没有任何validation代码在运行时以任何方式更改Tab键顺序。 这可能会导致焦点跳回到位于Panel顶部附近的控件,强制它自动滚动到新位置。

  3. 尝试在一个全新的,干净的项目中重现行为。 理想情况下,在Visual Studio中创建一个新项目,并按照与您遇到困难的项目中完全相同的方式布置控件。 这与我做的一样,部分原因是我没有你的特定项目,也是因为这是解决特别棘手的行为的最佳方法。 您的设计或源代码更有可能导致这种行为,而不是控件本身的某种错误。 但无论哪种方式,这都会让您确切地知道问题发生的位置,这将使您更接近解决方案。

您可以使用TableLayoutPanel“而不是”Panel“来避免滚动条更改其位置。