2016-06-29 6 views
1

У меня есть форма, которая программно добавляет в нее панель;Панель с автопрокруткой redraw

Для каждой задачи, входящей в мою программу, я добавляю ярлык и индикатор выполнения на панель с 30 пикселями Y, добавленными к предыдущей позиции Y.

Но когда панель иногда прокручивается, когда требуется прокрутить вниз, позиции умножаются и не находятся в их точном положении.

Помните, что я проверил и написал Y позицию на консоль и увидел, что Y положение нормально, но панель не показывает правильно

Я думаю, что проблема заключается в методе панели вытяжки, , но не знаю, как почини это.

Проблема в том, что задача 26 должна появиться сразу после 25, но не в правильном положении, несмотря на консоль, я видел, что позиция правильная.

код для добавления элементов управления:

private static void AddTaskControls(int taskId) 
     { 
      Label lbl = new Label(); 
      lbl = new Label(); 
      lbl.Name = "lbl" + taskId.ToString(); 
      lbl.Text = "Task " + taskId.ToString() + ":"; 
      lbl.Width = 57; 
      lbl.Height = 13; 
      lbl.Location = new Point(0, 25 + (taskId) * 30); 

      ProgressBar pr = new ProgressBar(); 
      pr = new ProgressBar(); 
      pr.Name = "pr" + taskId.ToString(); 
      pr.Width = 180; 
      pr.Height = 23; 
      pr.Location = new Point(50, 20 + (taskId) * 30); 

      Label lbl2 = new Label(); 
      lbl2.Name = "lbl" + taskId.ToString() + "List"; 
      lbl2.Text = "Starting " + taskId.ToString() + ""; 
      lbl2.Width = 200; 
      lbl2.Height = 13; 
      lbl2.Location = new Point(230, 25 + (taskId) * 30); 
      //Console.WriteLine(lbl2.Location.Y + "taskid:"+taskId); 


      if (panel1.InvokeRequired) 
      { 
       AddTaskControllsCallback t = new AddTaskControllsCallback(AddTaskControls); 
       panel1.BeginInvoke(t, new object[] { taskId }); 
      } 
      else 
      { 
       panel1.Controls.Add(lbl); 
       panel1.Controls.Add(pr); 
       panel1.Controls.Add(lbl2);    

       pr.BringToFront();     
      } 
     } 

enter image description here

enter image description here

+0

@MickyD Я отредактировал мой вопрос и добавил коды –

+0

@MickyD Нет, у меня нет никакого специального рисунка. просто контролирует, что вы видите на картинке выше. –

+0

Итак, как мне решить проблему? –

ответ

1

Это не имеет ничего общего с многопоточности. При добавлении элементов управления текущая позиция прокрутки используется для пересчитатьLocation. Weird? Да ..

Так что причина в том, что ваш Panelпрокручивает вниз, пока вы добавляете новые элементы управления. Я не вижу, где это происходит, но вот маленький тест, чтобы продемонстрировать эту проблему:

enter image description here

Выглядит знакомо, правда?

Я применять прокруткой в ​​коде, но в вашем случае причина должна быть похожа, как и должно быть исправление ..

private void button20_Click(object sender, EventArgs e) 
{ 
    // lets add a few buttons.. 
    for (int i = 0; i < 20; i++) 
    { 
     Button btn = new Button(); 
     btn.Top = i * 25; 
     btn.Parent = panel2; 
    } 
    // ..now let's enforce a scoll amount of 111 pixels: 
    panel2.AutoScrollPosition = new Point(panel2.AutoScrollPosition.X, 
              -panel2.AutoScrollPosition.Y + 111); 

    // ..and add a few more buttons.. 
    for (int i = 20; i < 40; i++) 
    { 
     Button btn = new Button(); 
     btn.Top = i * 25; // not good enough! 
     // btn.Top = i * 25 + panel2.AutoScrollPosition.Y; // this will fix the problem! 
     btn.Parent = panel2; 
    } 
} 

Так что ваш код должен установить Locations так:

lbl.Location = new Point(0, 25 + (taskId) * 30 + panel1.AutoScrollPosition.Y); 
.. 
pr.Location = new Point(50, 20 + (taskId) * 30 + panel1.AutoScrollPosition.Y)); 
.. 
lbl2.Location = new Point(230, 25 + (taskId) * 30 + panel1.AutoScrollPosition.Y)); 

(Или выяснить, как происходит прокрутка и предотвратить его.)

+0

, поэтому я должен рассчитать 111 пикселей, например, для каждой кнопки, когда я хочу перерисовать? и если значение! = 25px выполняет эту работу? Я должен перерисовывать каждый элемент управления в списке прокрутки панели? –

+0

Нет !!! Просто используйте 3 строки в нижней части ответа, т. Е. Добавьте 'AutoScrollPosition.Y' к значениям y всех ваших трех элементов управления при их добавлении. Как только они помещены, никаких дальнейших действий не требуется. 111 был всего лишь примером того, как прокрутка забивает места, и проблема возникает только тогда, когда (каким-то образом) __прокручивается во время _ процесса __adding__ элементов управления. – TaW

+0

большое спасибо, он решил мой вопрос. cheers –

0

Я обнаружил, что это намного проще, чтобы добавить вторую панель внутри прокрутка панели, объявление d элементы управления для этой второй панели и увеличьте размер второй панели. Любые проблемы с прокруткой позиции тогда не применяются.

Так создать форму, добавить кнопку, добавить панель panel1 с AutoScroll = true;, и добавить еще одну панель panel2 внутри первой панели (с адресом 0, 0).

private void button1_Click(object sender, EventArgs e) 
{ 
    // lets add a few buttons.. 
    for (int i = 0; i < 25; i++) 
    { 
     Button btn = new Button(); 
     btn.Top = i * 25; 
     panel2.Controls.Add(btn); // Add to panel2 instead of panel1 
    } 

    // Recalculate size of the panel in the scrollable panel 
    panel2.Height = panel2.Controls.Cast<Control>().Max(x => x.Top + x.Size.Height); 
    panel2.Width = panel2.Controls.Cast<Control>().Max(x => x.Left + x.Size.Width); 
} 
+0

Не знаете, как это будет работать, но imo не проще, чем установить расположение в первую очередь. – TaW

+0

@Taw Таким образом, вам не нужно принимать во внимание прокручиваемую позицию. Если вы не знаете, как это работает, тогда, возможно, вы сможете попробовать и посмотреть сами. – Maarten

+0

ах, извините, я не совсем понял вашу идею. так что да, я думаю, это сработает. но добавление дополнительной панели, когда она действительно не нужна, кажется еще не «намного проще». Обратите внимание, что мое решение состоит только из __one добавленного значения__ в y-позиции. – TaW