【问题标题】:Controls in panel are hidden until I resize the window面板中的控件被隐藏,直到我调整窗口大小
【发布时间】:2019-05-30 03:55:52
【问题描述】:

我一直遇到控制面板被“切断”的问题。但是,当我手动开始调整表单大小时,丢失的控件会在每次调整大小后重新出现。 我创建了一个测试应用程序来显示这个问题。 该应用程序本身在主窗体上添加了一个面板。 在这个面板中,我添加了 10 个分组框,每个分组框有 100 个标签。 以下是创建测试应用程序并重现问题的步骤(到目前为止,我只在 .NET 4.6.1 和 Visual Studio 2017 上尝试过)

  • 创建一个新的 windows 窗体项目
  • 更新默认表单的构造函数如下

    public Form1()
    {
        InitializeComponent();
    
        // My stuff
        var panContents = new Panel();
        panContents.AutoScroll = true;
        panContents.AutoSize = true;
        panContents.AutoSizeMode = AutoSizeMode.GrowAndShrink;
        panContents.Dock = DockStyle.Fill;
        for (int g = 10; g >= 0; g--)
        {
            var groupBox = new GroupBox();
            groupBox.AutoSize = true;
            groupBox.AutoSizeMode = AutoSizeMode.GrowOnly;
            groupBox.Dock = DockStyle.Top;
            groupBox.Text = "Group " + g;
    
            var mainPanel = new Panel();
            mainPanel.Dock = DockStyle.Fill;
            mainPanel.AutoSize = true;
            mainPanel.AutoSizeMode = AutoSizeMode.GrowOnly;
            for (int i = 100; i >= 0; i--)
            {
                var con = new Label();
                con.Text = "Label " + i;
                con.Height = 100;
                con.Dock = DockStyle.Top;
                mainPanel.Controls.Add(con);
            }
            groupBox.Controls.Add(mainPanel);
            panContents.Controls.Add(groupBox);
        }
    
        this.Controls.Add(panContents);
    }
    
  • 运行项目(不调整表单大小)

  • 滚动到表单底部附近,您会注意到并非所有 10 个组框都已呈现
  • 手动调整表单大小,您会注意到一些缺少的标签和组框开始出现
  • 不断调整表单大小,直到显示所有控件

有人知道为什么会这样吗?我想这可能与面板大小的限制有关。但是,如果是这种情况,我不希望调整表单大小以开始显示这些缺少的控件。

PS 我知道我可以通过使用标签或分页来解决这个问题。但是我想知道为什么我会看到我所看到的行为(理想情况下我想避免使用标签或分页)

【问题讨论】:

  • 您可能导致表单/面板滚动超过最大滚动值 (IIRC 32,767)。
  • 这正是我的想法....但这并不能解释为什么调整表单大小会导致越来越多的控件出现。如果我达到了面板限制,那么调整表单的大小应该不会对显示的控件数量产生任何影响......如果这有意义的话

标签: .net winforms label panel groupbox


【解决方案1】:

@亚斯,

这是一个相当有趣的问题——直到加载/运行您的代码才完全掌握它。我碰巧同意 Jimi 的观点——你可能会遇到内部限制,无论这种限制看起来多么奇怪。正如您所指出的,调整表单的高度/宽度不应克服限制。所以无论内部发生什么,这有点奇怪和出乎意料。

但我有一个解决方案给你:诚然,这是一个拼凑,但有时这是我们唯一的选择。如果您的项目规范需要与您提供的表格类似的表格 - 最终高度值远远超过 100,000 的表格,那么此解决方案应该符合要求。

将以下代码添加到 Form1 初始化代码的末尾,如您的原始帖子中所示(见下文)。我所做的是以编程方式“调整”表单的高度,如此轻微地——反复地——直到所有面板都被完全渲染。我认为这将是您最好的选择。

为了记录,我在这方面花了很多时间。我曾在各种控件、DoEvents() 等上尝试过各种 Refresh() 组合,但无济于事。我什至尝试不使用停靠和自动调整大小,而是手动设置顶部和高度(这也不起作用)。因此,我认为下面的代码确实是解决此问题的唯一方法,除了 Microsoft 的修复。

** 要使下面的代码正常工作,请在代码的 InitializeComponent() 之后立即添加这一行;行:

this.Show();

然后在代码的右大括号之后添加此代码:

     // fix the panContents panel
     long currentMaximum = 0;
     while (true)
     {
        var preserveHeight = this.Height;
        // tweak the height
        this.Height += 1;
        // set it back the height
        this.Height = preserveHeight;

        // test to see if the scroll bar max remains at its previous value
        // if it does, we're done
        if (currentMaximum == panContents.VerticalScroll.Maximum)
           break;

        // otherwise, preserve the current maximum scroll bar position
        currentMaximum = panContents.VerticalScroll.Maximum;

        // now scroll to the bottom of the panel
        panContents.VerticalScroll.Value = panContents.VerticalScroll.Maximum;
        // necessary step to ensure scroll bar value is set
        panContents.PerformLayout();
     }

     // scroll to the top
     panContents.VerticalScroll.Value = 0;
     // necessary step to ensure scroll bar value is set
     panContents.PerformLayout();

【讨论】:

  • 我喜欢您所做的 hack :) 我可以看到您正在尝试的内容,但是当我在代码下方添加时它不起作用(第二次迭代后 while 循环退出,因为panContents.VerticalScroll.Maximum 似乎总是 100)。我会尝试这个想法......但我不知道我是否想要在我的代码中使用这个(讨厌黑客:P)我怀疑微软会对此做任何事情。我想知道是否有任何其他控件可以用作替代品(ListView、Datagridview),或者它们可能有高度限制......
  • 给我几分钟——我的系统从来没有值 100——它是表单高度的完整值。我会尽快进一步评论...
  • 我修改了我的答案......可能有一种方法可以使用 100% 最大值,但正如您所发现的那样,我认为这不会奏效。我知道这是一个 hack,但实际上,您已经发现了一个明显的错误。你的代码没有理由不按所写的那样工作。我同意微软可能不会解决这个问题,所以我认为如果事实上这种设计是你所需要的,那么黑客可能是你唯一可行的选择。
  • 虽然我认为我已经为您的问题提供了令人满意的解决方案[如果您同意,请接受](因为您的问题的答案是:您在 Winforms 中发现了一个错误!--但我认为您也想要一个解决方案),您可能想尝试一些来自 DevExpress 或 Syncfusion 的组件。我怀疑支持滚动的第三方面板控件可能会起作用,因为这似乎是一个面板控件问题。如果您发现合适的替代控件,请更新我们!
  • 感谢您的帮助。我已将其标记为答案,因为它确实看起来像是 winforms/microsoft 的问题。 “破解”可能是面板问题的唯一可行解决方案。我的直觉认为我可能需要重新设计布局,以避免接近面板限制;(
猜你喜欢
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 2018-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
相关资源
最近更新 更多