如何在Windows窗体中实例化大量按钮?

加布里埃尔·费雷拉·罗萨利诺(Gabriel Ferreira Rosalino)

我正在开发剧院预订软件。我使用的是Windows Forms,席位由2维数组表示。我按如下所示绘制按钮:

public void DrawSeats()
{
    // pnl_seats is a Panel
    pnl_seats.Controls.Clear();
    // Here I store all Buttons instance, to later add all buttons in one call (AddRange) to the Panel
    var btns = new List<Control>();
    // Suspend layout to avoid undesired Redraw/Refresh
    this.SuspendLayout();
    for (int y = 0; y < _seatZone.VerticalSize; y++)
    {
        for (int x = 0; x < _seatZone.HorizontalSize; x++)
        {
            // Check if this seat exists
            if (IsException(x, y))
                continue;
            // Construct the button with desired properties. SeatSize is a common value for every button
            var btn = new Button
            {
                Width = SeatSize, 
                Height = SeatSize,
                Left = (x * SeatSize),
                Top = (y * SeatSize),
                Text = y + "" + x,
                Tag = y + ";" + x, // When the button clicks, the purpose of this is to remember which seat this button is.
                Font = new Font(new FontFamily("Microsoft Sans Serif"), 6.5f)
            };

            // Check if it is already reserved
            if (ExistsReservation(x, y))
                btn.Enabled = false;
            else
                btn.Click += btn_seat_Click; // Add click event

            btns.Add(btn);
        }
    }
    // As said before, add all buttons in one call
    pnl_seats.Controls.AddRange(btns.ToArray());
    // Resume the layout
    this.ResumeLayout();
}

但是已经有20 x 20的座位区(400个按钮),它花了将近1分钟的时间来绘制它,并且在调试中我检查了性能的不足是按钮的实例化。

有没有办法使它更快?也许在实例化过程中禁用所有事件,或者也禁用另一个具有Click事件的轻量控件?

更新lbl是一个测试,正确的是btn,抱歉。

更新2:

这里是IsExceptionExistsReservations方法:

private bool IsException(int x, int y)
{
    for (var k = 0; k < _seatsExceptions.GetLength(0); k++)
        if (_seatsExceptions[k, 0] == x && _seatsExceptions[k, 1] == y)
            return true;
    return false;
}

private bool ExistsReservation(int x, int y)
{
    for (var k = 0; k < _seatsReservations.GetLength(0); k++)
        if (_seatsReservations[k, 0] == x && _seatsReservations[k, 1] == y)
            return true;
    return false;
}
史蒂夫

假设您将保留和排除的数组更改为

public List<string> _seatsExceptions = new List<string>();
public List<string> _seatsReservations = new List<string>();

您可以在列表中添加排除项和保留项,例如

_seatsExceptions.Add("1;10");
_seatsExceptions.Add("4;19");
_seatsReservations.Add("2;5");
_seatsReservations.Add("5;5");

您的排除和保留检查可以更改为

bool IsException(int x, int y)
{
    string key = x.ToString() + ";" + y.ToString();
    return _seatsExceptions.Contains(key);
}
bool ExistsReservation(int x, int y)
{
    string key = x.ToString() + ";" + y.ToString();
    return _seatsReservations.Contains(key);
}

当然,我不知道您是否可以在程序中进行此更改。但是,请考虑早晚更改阵列上的搜索。

编辑我进行了一些测试,虽然20x20按钮的虚拟网格可以令人满意地工作(平均31毫米0.775ms),但是较大的网格会明显放慢速度。在200x50分辨率下,时间跳到10秒(平均1,0675)。因此,也许需要一种不同的方法。绑定的DataGridView可能是一个更简单的解决方案,并且相对容易处理。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Windows窗体中实例化大量按钮?

来自分类Dev

如何在Windows窗体中自动创建按钮?

来自分类Dev

如何在 Windows 窗体中动态添加单选按钮?

来自分类Dev

如何在Windows窗体计算器中的计算器中创建零按钮

来自分类Dev

如何在C#Windows窗体中创建选项窗体?

来自分类Dev

如何在Windows窗体应用程序中设计自定义关闭,最小化和最大化按钮?

来自分类Dev

如何在Windows窗体中动态添加按钮及其事件?

来自分类Dev

如何在C#Windows窗体中创建一个重置按钮?

来自分类Dev

如何在Windows窗体中嵌入notepad ++?

来自分类Dev

如何在Windows窗体中嵌入notepad ++?

来自分类Dev

如何在 Windows 窗体中创建一个按钮,单击该按钮时要求输入两个值

来自分类Dev

单击 Windows 窗体中的按钮时如何显示对象的属性?

来自分类Dev

在Windows窗体中单击窗体后如何删除按钮上的黑色轮廓

来自分类Dev

如何在Windows窗体中的Panel中重新绘制平滑

来自分类Dev

如何在Excel中删除大量命令按钮

来自分类Dev

如何在Windows窗体中创建树视图菜单?

来自分类Dev

如何在Windows窗体中显示处理组件

来自分类Dev

如何在Windows窗体TreeView中按标签选择节点

来自分类Dev

如何在Windows窗体中打开app.config?

来自分类Dev

如何在Windows窗体中禁用NumericUpDown上的滚动

来自分类Dev

如何在Windows窗体中增加高斯模糊强度

来自分类Dev

如何在SharpDevelop中向Windows窗体添加图标?

来自分类Dev

如何在Windows窗体中添加Listview项?

来自分类Dev

如何在 windows 窗体 applctn 中添加视频?

来自分类Dev

如何在 Windows 窗体中禁用本地数据缓存?

来自分类Dev

如何在 Visual Studio 2017 中关闭 Windows 窗体继承?

来自分类Dev

如何在C Sharp Windows窗体应用程序中从窗体2修改窗体3中的值

来自分类Dev

如何在Java中实例化对象?

来自分类Dev

如何在Scala中实例化Unit?

Related 相关文章

  1. 1

    如何在Windows窗体中实例化大量按钮?

  2. 2

    如何在Windows窗体中自动创建按钮?

  3. 3

    如何在 Windows 窗体中动态添加单选按钮?

  4. 4

    如何在Windows窗体计算器中的计算器中创建零按钮

  5. 5

    如何在C#Windows窗体中创建选项窗体?

  6. 6

    如何在Windows窗体应用程序中设计自定义关闭,最小化和最大化按钮?

  7. 7

    如何在Windows窗体中动态添加按钮及其事件?

  8. 8

    如何在C#Windows窗体中创建一个重置按钮?

  9. 9

    如何在Windows窗体中嵌入notepad ++?

  10. 10

    如何在Windows窗体中嵌入notepad ++?

  11. 11

    如何在 Windows 窗体中创建一个按钮,单击该按钮时要求输入两个值

  12. 12

    单击 Windows 窗体中的按钮时如何显示对象的属性?

  13. 13

    在Windows窗体中单击窗体后如何删除按钮上的黑色轮廓

  14. 14

    如何在Windows窗体中的Panel中重新绘制平滑

  15. 15

    如何在Excel中删除大量命令按钮

  16. 16

    如何在Windows窗体中创建树视图菜单?

  17. 17

    如何在Windows窗体中显示处理组件

  18. 18

    如何在Windows窗体TreeView中按标签选择节点

  19. 19

    如何在Windows窗体中打开app.config?

  20. 20

    如何在Windows窗体中禁用NumericUpDown上的滚动

  21. 21

    如何在Windows窗体中增加高斯模糊强度

  22. 22

    如何在SharpDevelop中向Windows窗体添加图标?

  23. 23

    如何在Windows窗体中添加Listview项?

  24. 24

    如何在 windows 窗体 applctn 中添加视频?

  25. 25

    如何在 Windows 窗体中禁用本地数据缓存?

  26. 26

    如何在 Visual Studio 2017 中关闭 Windows 窗体继承?

  27. 27

    如何在C Sharp Windows窗体应用程序中从窗体2修改窗体3中的值

  28. 28

    如何在Java中实例化对象?

  29. 29

    如何在Scala中实例化Unit?

热门标签

归档