【问题标题】:Don't autoscroll on button click不要在按钮单击时自动滚动
【发布时间】:2014-08-19 15:05:22
【问题描述】:

我正在开发一个用作仪表板的应用程序。该表单包括一个包含多个 datagridviews 的 flowlayoutpanel。 flowlayoutpanel 设置为自动滚动,因为通常有比可见页面容纳的更多数据网格。每个DataGrid都有一个uppletClick事件,它在选择特定列(3)时打开图表表单。所有图表功能都可以正常工作。我遇到的问题是,当我单击仅部分可见的数据网格时,页面滚动以将该数据网格视图完全带到页面上。因为这发生在单击 (MouseDown) 上,所以页面滚动得如此之快,以至于它实际上并没有触发单击事件,而是选择了列中的多个单元格,就好像用户单击/向下拖动列一样。

我希望发生的是,当用户单击仅部分可见的 datagridview 时,图表会打开,然后页面会在图表关闭事件上滚动。如果有问题的数据网格视图有焦点,但部分不在页面上,这实际上会发生。例如,如果我选择 datagridview,然后向下/向上滚动直到它部分离开可见页面,然后单击第 3 列中的一个单元格。它将显示图表,然后在我关闭图表时自动滚动。但是如果 datagridview 没有焦点,它会自动滚动。我曾尝试将 flowlayoutpanel 放在另一个面板中,这在某种程度上有效,但不一致。

抱歉,描述太长了,但我会尽可能详细。任何帮助将不胜感激。该应用程序使用 VS 2013 在 .NET 中构建。

【问题讨论】:

    标签: vb.net winforms datagridview autoscroll flowlayoutpanel


    【解决方案1】:

    这似乎类似于我在面板内使用多个 datagridviews 时遇到的问题,this article 是我的解决方案。

    简而言之,您需要做的就是创建一个自定义面板并覆盖 ScrollToControl 方法。我相信你可以用 FlowLayoutPanel 做同样的事情。

    编辑: 您的 CustomPanel 类应如下所示(使用 developer fusion 转换的代码

    Public Class CustomPanel
    Inherits System.Windows.Forms.FlowLayoutPanel
    Protected Overrides Function ScrollToControl(activeControl As System.Windows.Forms.Control) As System.Drawing.Point
        ' Returning the current location prevents the panel from
        ' scrolling to the active control when the panel loses and regains focus
        Return Me.DisplayRectangle.Location
    End Function
    End Class
    

    如果这不起作用,您可以尝试继承常规 Panel 并在其中放置一个 FlowLayoutPanel。

    【讨论】:

    • TDull,我尝试了这个修复,但没有任何乐趣。我还尝试了将 DisplayRectangle.Location 替换为 AutoScrollPosition 或 AutoScrollOffset 的变体。没有一个有预期的效果。也许您可以为我澄清一些事情(如果这是补救措施,请原谅我)。你说创建自定义面板是什么意思?我的代码:Public Class NoAutoScrollFlowLayoutPanel Inherits System.Windows.Forms.FlowLayoutPanel Protected Overrides Function ScrollToControl(activeControl As System.Windows.Forms.Control) As System.Drawing.Point Return DisplayRectangle。位置结束函数结束类
    • 抱歉,最后一点有点乱。我试图发布我的建议修复版本。因为它在 VB .NET 中,所以有点不同。也许语法关闭了?我的代码: Public Class NoAutoScrollFlowLayoutPanel Inherits System.Windows.Forms.FlowLayoutPanel Protected Overrides Function ScrollToControl(activeControl As System.Windows.Forms.Control) As System.Drawing.Point Return DisplayRectangle.Location 'AutoScrollPosition End Function End Class
    • 这有点难读,但看起来你的代码是正确的..看我的编辑:)
    • TDull,很抱歉粘贴工作做得不好。无论如何,我更改了我的代码以使用 CustomPanel 命名约定,只是为了更好地衡量,并且我在设计器中更改了父窗体的类型。所以它来自:
    • 天啊,习惯了论坛发帖。采取 2:我仔细检查了我的代码,它与你的匹配。我什至更改了我的代码以使用 CustomPanel 命名约定,只是为了更好地衡量。根据您给我的链接上的一个 cmets,我尝试在设计器中更改父表单的类型。 FlowLayoutPanel 的名称是“实际的”。我必须将 Friend WithEvents 位从“Friend WithEvents actual As FlowLayoutPanel”更改为 Friend WithEvents actual As CustomPanel。
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 2014-05-14
    • 2011-09-17
    相关资源
    最近更新 更多