当窗体有许多dropdownlist控件时,C#.net窗口窗体中的慢度会调整大小

当窗体有许多dropdownlist控件时,C#.net窗口窗体中的慢度会调整大小,c#,.net,winforms,C#,.net,Winforms,我制作了一个包含许多下拉列表的windows窗体,这些下拉列表放在一个网格(不是datagrid)中,当我在所有窗体中使用anchor=left-right-top-bottom和dock=fill选项时,窗体在运行时的调整速度会变慢 停靠和锚定选项有什么问题 这是表单的一般问题吗?使用.net组件和windows窗体是否是一个普遍的缺点 我没有在调整控件大小时处理任何自定义事件,因此问题在于Microsoft开发的控件。我应该避免使用dock=fill吗?在每次调整大小移动formforms

我制作了一个包含许多下拉列表的windows窗体,这些下拉列表放在一个网格(不是datagrid)中,当我在所有窗体中使用anchor=left-right-top-bottom和dock=fill选项时,窗体在运行时的调整速度会变慢

停靠和锚定选项有什么问题

这是表单的一般问题吗?使用.net组件和windows窗体是否是一个普遍的缺点


我没有在调整控件大小时处理任何自定义事件,因此问题在于Microsoft开发的控件。我应该避免使用dock=fill吗?

在每次调整大小移动
form
forms resize
table layout panel
强制调整大小和重新定位子控件(下拉菜单)时,它都会消耗处理器,这是很正常的,因为设置了
锚定
属性

有一个技巧可以避免在调整大小时给用户带来挫折:

BeginResize()
EndResize()
事件处理程序上使用
SuspendLayout()和
ResumeLayout()

请看下面的具体示例:


应该适合您。

如果您也在WinForms应用程序中使用图片或繁重的UI元素,您可能还希望禁用不必要的重画事件

当表单中发生大小调整时,这个简单的肮脏技巧将给您带来巨大的性能提升

以下代码应放在表单的类中:

protected override void OnResize(EventArgs e)
{
    this.SuspendDrawing();
    base.OnResize(e);
    this.ResumeDrawing();
}

protected override void OnResizeBegin(EventArgs e)
{
    this.SuspendDrawing();
    base.OnResizeBegin(e);
}

protected override void OnResizeEnd(EventArgs e)
{
    base.OnResizeEnd(e);
    this.ResumeDrawing();
}

protected override void OnClosing(CancelEventArgs e)
{
    this.SuspendDrawing();
    base.OnClosing(e);
    this.ResumeDrawing();
}
这是一种扩展方法,它实现了所有的技巧:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Example
{
    public static class ControlExtensions
    {
        [DllImport("user32.dll")]
        public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam);

        private const int WM_SETREDRAW = 11;

        public static void SuspendDrawing(this Control control) => SendMessage(control.Handle, WM_SETREDRAW, false, 0);

        public static void ResumeDrawing(this Control control)
        {
            SendMessage(control.Handle, WM_SETREDRAW, true, 0);
            control.Refresh();
        }
    }
}

您使用的网格类型是什么?TableLayoutPanel或DataGridView?@KevinMcCormick table layout Panel表单的OnPaint覆盖或表单的paint事件中是否有任何内容?由于锚定,所有这些控件在移动时都需要重新绘制。重新绘制大量控件需要时间。一个简单的修复方法是使用窗体的ResizeBegin事件隐藏“网格”,并使用ResizeEnd事件使其再次可见。实际上,这不是winform或某些布局面板的问题,而是combobox控件的问题。它的控制速度非常慢,在创建和调整大小时需要花费大量时间。