如何阻止Winforms面板滚动?

22 .net panel winforms

如果在300像素高的面板上放置一个400像素高的DataGridView,那么面板上会有一个滚动条,然后向下滚动以显示网格的下半部分,然后单击面板外的控件,然后单击网格中的一条线,面板向上滚动到顶部,并选择网格中的错误行.

它不仅仅是一个DataGridView; 它发生在任何高于面板的控件上,例如Infragistics UltraWinGrid,Rich Text Box.我把它作为Infragistics的一个bug提出来,但是他们说这是微软的问题.

我已尝试将所有相关事件用于控件,但Panel滚动在事件触发之前发生.

有什么建议?

sto*_*one 46

这是由ScrollableControl类自动触发ScrollToControl事件引起的,并且事件处理程序滚动显示控件左上角的焦点.当可滚动容器控件仅包含一个控件时,此行为没有帮助.我对此行为感到非常沮丧,直到我发现如何阻止它.

停止此行为的方法是覆盖ScrollToControl事件处理程序,如下所示:

class PanelNoScrollOnFocus : Panel
{
    protected override System.Drawing.Point ScrollToControl(Control activeControl)
    {
        return DisplayRectangle.Location;
    }
}
Run Code Online (Sandbox Code Playgroud)

用此面板控件替换面板控件.完成.

  • 谢谢,最后一小时我一直在桌子上敲我的头.您的解决方案节省了去医院的旅程!:) (5认同)
  • 首先,将此类添加到项目中.(创建一个新的空类文件并粘贴上面的代码.)然后转到表单设计器并查看工具箱.您现在应该看到其中列出的新控件PanelNoScrollOnFocus.将其拖到画布上; 将其用作面板而不是使用香草面板.要更改现有表单,请手动编辑.designer.cs文件; 搜索"System.Windows.Forms.Panel"并将其替换为您希望此行为的每个Panel的PanelNoScrollOnFocus. (3认同)

Bla*_*asp 2

我猜测您正在将面板的 AutoScroll 属性设置为 true。执行此操作时,切换应用程序会将滚动位置重置为零,并且面板也会重置其位置。

如果关闭自动滚动并添加自己的滚动条,则可以设置滚动条的最大值和最小值以符合面板的要求,然后在滚动条的 Scroll 事件中设置面板的滚动值。当您切换窗口时,此设置不会重置。

就像是:

private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
{
    panel1.VerticalScroll.Value = vScrollBar1.Value;
}
Run Code Online (Sandbox Code Playgroud)

这是我的新经历,我必须重新创造它。我可能需要在我的网站上添加一篇关于它的文章:-)