4

C# を使用して座席予約ソフトウェアを作成していますが、多くの座席を即座に描画する方法がわかりません。私は3つの方法を試しています..

  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. Graphics を使用して Rectangle を描画する

    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

あなたの問題は、一度に 1 つのコントロールしか追加していないことです。コントロールを追加すると、親パネル (最良の場合) とおそらくフォーム全体 (最悪の場合)の完全な更新 (ソフトウェアGDI+ レンダリングは非常に遅い) が強制されます。

すべてのコントロールを作成し、 を使用して 1 行に追加してみてくださいPanel.Controls.AddRange。これにより、1 回だけ更新が促されます。

また、これらのコントロールは、フォームが最初に表示されたときと、座席数が変更されたときにのみ追加する必要があります。これは、コストがかかる (そして比較的遅い) 操作です。

座席ラベル座席境界UserControlを別々に管理する必要がないように、座席ごとにを作成することを検討してください。この方法では、リストを 1 つだけ持つことができます。座席を順番に追加すると、リスト内の項目のインデックスがその座席番号にマップされます! おそらくこれでパフォーマンスが向上することはありませんが、コードは扱いやすくなります。

于 2013-11-13T10:26:24.590 に答える