【问题标题】:Strange location of panels面板的奇怪位置
【发布时间】:2014-05-31 22:49:46
【问题描述】:

我有一个程序是某种测试。在这个测试中,我的函数AddQuestion 添加了一个带有问题的面板。为了一个一个地放置这些面板,我有一个变量loc 来保存下一个面板的位置。前两个带有问题的Panel 添加正确,但接下来的问题位于错误的位置(远离底部)。会是什么?

public void AddQuestion(int number, Question quest)
        {
            Panel p = new Panel();
            p.Name = "panel" + (number);
            p.Size = new Size(550, 400);
            p.Location = new Point(40, loc);
            p.BackColor = System.Drawing.Color.Bisque;
            p.AutoScroll = true;
            Panel pict_block = new Panel();
            pict_block.Size = new Size(480, 200);
            pict_block.Location = new Point(10, 10);
            PictureBox pict = new PictureBox();
            pict.Image = quest.image;
            pict.Size = new Size(240, 180);
            pict.SizeMode = PictureBoxSizeMode.StretchImage;
            pict.Location = new Point(130, 1);
            pict_block.Controls.Add(pict);
            p.Controls.Add(pict_block);

            Label number_text = new Label(); //номер питання
            number_text.Text = "Питання № " + number ;
            number_text.Font = new Font("Aria", 8, FontStyle.Bold);
            number_text.AutoSize = false;
            number_text.Location = new Point(400, 210);
            p.Controls.Add(number_text);

            Label q_text = new Label(); // текст питання
            q_text.Text = quest.question_text;
            q_text.Font = new Font("Aria", 9, FontStyle.Bold);
            q_text.AutoSize = false;
            q_text.Size = new Size(400, 50);
            q_text.Location = new Point(5, 220);
            p.Controls.Add(q_text);
            int iter = q_text.Location.Y + 60;
            if (CheckIfMuliple(number))
            {
                foreach (string key in quest.answers.Keys)
                {
                    CheckBox rb = new CheckBox();
                    rb.Text = key;
                    rb.AutoSize = true;
                    rb.Size = new Size(300, 25);
                    rb.Location = new Point(q_text.Location.X + 15, iter);
                    iter += 30;
                    p.Controls.Add(rb);
                }

            }
            else
                {
                    foreach (string key in quest.answers.Keys)
                    {
                        RadioButton rb = new RadioButton();
                        rb.Text = key;
                        rb.Size = new Size(300, 25);
                        rb.AutoSize = true;
                        rb.Location = new Point(q_text.Location.X + 10, iter);
                        iter += 30;
                        p.Controls.Add(rb);
                    }
                }
            questions_panel.Controls.Add(p);
            loc += 450;

        }

位置好:

位置不好:

我还注意到,当我添加一些面板,然后在表单中间滚动并添加新问题时,它不是位于底部,而是位于中心的某个位置。从下一个屏幕截图开始,有 6 个问题,然后是 15 个问题:

【问题讨论】:

  • 你能张贴一张图片来显示你的问题到底是什么样的吗?
  • loc 定义在哪里,是否正确?
  • BanksySan, 'loc' 被声明为顶部表单的成员:int loc = 20;

标签: c# winforms


【解决方案1】:
    p.Location = new Point(40, loc);

当外部面板滚动时,这将无法正常工作。您必须通过该面板的滚动位置来抵消它。修复:

   p.Location = new Point(40  + questions_panel.AutoScrollPosition.X,
                          loc + questions_panel.AutoScrollPosition.Y);

   loc += 450;

当您的程序在具有以不同的每英寸点数设置运行的视频适配器的机器上运行时,这将无法正常工作。现在很常见,现代版本的 Windows 使其非常易于更改。面板将自动重新缩放以匹配 DPI 设置。修复:

  loc += p.Height + 50;

【讨论】:

    【解决方案2】:

    手动做到这一点非常困难。

    我建议您将questions_panel 更改为TableLayoutPanel。它会自动为您定位新控件。

    表格布局面板

    表示在网格中动态布置其内容的面板 由行和列组成。

    【讨论】:

    • 您能告诉我:如何更改 TableLayoutPanel 中两个面板(问题)之间的间隔?
    • 尝试修改添加到布局中的控件的 Margin 属性
    【解决方案3】:

    我能够复制您的问题,并且能够通过始终根据最后一个面板的位置偏移新面板的顶部来解决它。我更改了您的代码:

    questions_panel.Controls.Add(p);
    loc += 450;
    

    到:

    if (questions_panel.Controls.Count > 0)
    {
        //Location of Top of last panel added then offset vertically by 450
        p.Location = new Point(p.Location.X, questions_panel.Controls[questions_panel.Controls.Count-1].Location.Y +450);
        questions_panel.Controls.Add(p);
    }
    else
        questions_panel.Controls.Add(p);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      相关资源
      最近更新 更多