4

我正在使用 C# 构建座位预留软件,我很困惑如何立即绘制大量座位。我正在尝试三种方式,即..

  1. 使用用户控件

https://dl.dropboxusercontent.com/u/81727566/seatForm.png

    public void DrawUsercontrol(int x, int y)
    {
        int space = 4;
        int SeatLimit = 165;
        int RowSeatLimit = 15;
        for (var i = 1; i < SeatLimit; i++)
        {
            UserControl1 ctrl = new UserControl1();
            ctrl.Size = new System.Drawing.Size(25, 25);
            ctrl.Location = new Point(x + space, y);
            if (i % RowSeatLimit == 0)
            {
                x = 1;
                y = y + 25 + space;
            }
            x = x + 25 + space;
            ctrl.label1.Text = i.ToString();
            ctrl.label1.Click += new EventHandler(label1_Click);
            panel1.Controls.Add(ctrl);
        }
    }
  1. 使用“面板”控件

    public void DrawingPanel(int x, int y)
    {
        Panel myPanel = new Panel();
        int width = 16;
        int height = 16;
        myPanel.Size = new Size(width, height);
        myPanel.BackColor = Color.White;
        myPanel.Location = new Point(x, y);
        Label mylabel = new Label();
        mylabel.Text = "4";
        myPanel.Controls.Add(mylabel);
        myPanel.BackColor = Color.YellowGreen;
        // this.Controls.Add(myPanel);
        panel1.Controls.Add(myPanel);
    }
    
  2. 使用图形和绘制矩形

    public void DrawingSquares(int x, int y)
    {
        SolidBrush myBrush = new SolidBrush(System.Drawing.Color.Red);
        Graphics graphicsObj;
        graphicsObj = this.panel1.CreateGraphics();
        Rectangle myRectangle = new Rectangle(x, y, 30, 30);
        graphicsObj.FillRectangle(myBrush, myRectangle);
        graphicsObj.Dispose();
    }
    

我参考第一个选项,但它太慢了。我该如何决定?

4

1 回答 1

4

您的问题是您一次只添加一个控件。添加控件会强制完全刷新父面板(最好的情况)和整个表单(最坏的情况) (软件GDI+ 渲染非常慢)。

尝试创建所有控件并使用Panel.Controls.AddRange. 这只会提示一次刷新。

您还应该只在表单首次显示和座位数量发生变化时添加这些控件 - 这是一项昂贵(且相对较慢)的操作。

考虑为每个座位创建一个UserControl,这样您就不必单独管理座位标签座位边界- 这样您就可以只拥有一个列表。如果您按顺序添加座位,则列表中项目的索引将映射到其座位号!您可能不会因此而获得性能提升,但您的代码将更易于使用。

于 2013-11-13T10:26:24.590 回答