установка положения элемента управления не работает, когда прокрутка перемещена (c #, winforms) - PullRequest
4 голосов
/ 23 февраля 2010

Описание проблемы:

  • Создание «пользовательского элемента управления». Установите для свойства AutoScroll значение true. Измените его цвет bg на зеленый.
  • Создать второй «пользовательский элемент управления». Измените его цвет bg на красный.
  • На главной форме поместите первый пользовательский элемент управления
  • В коде создать 20 экземпляров второго элемента управления
  • Добавить кнопку и в кнопку:
    • В коде установите их положение в цикле, как c.Location = new Point (0, y);
    • y + = c.Высота;
  • Запустить приложение.
  • Нажмите кнопку
  • Прокрутка контейнера
  • Нажмите кнопку еще раз, и может кто-нибудь объяснить, пожалуйста ПОЧЕМУ 0 - это не начало формы контейнера ?! Органы управления смещены ...

Прежде чем ответить:

1) Да, все должно быть так

2) Пример кода ниже:

public partial class Form1 : Form
{
   List<UserControl2> list;

   public Form1()
   {
      InitializeComponent();
      list = new List<UserControl2>();
      for (int i = 0; i < 20; i++)
      {
         UserControl2 c = new UserControl2();
         list.Add(c);
      }
   }

   private void Form1_Load(object sender, EventArgs e)
   {
      foreach (UserControl2 c in list)
         userControl11.Controls.Add(c);
   }

   private void button1_Click(object sender, EventArgs e)
   {
      int y = 0;
      foreach (UserControl2 c in list)
      { 
         c.Location = new Point(0, y);
         y += c.Height;
      }
   }
}

Ответы [ 2 ]

6 голосов
/ 23 февраля 2010

Это потому, что Местоположение дает координаты левого верхнего угла элемента управления относительно левого верхнего угла его контейнера. Поэтому при прокрутке вниз местоположение изменится.

Вот как это исправить:

  private void button1_Click(object sender, EventArgs e)
  {
     int y = list[0].Location.Y;
     foreach (UserControl2 c in list)
     {
        c.Location = new Point(0, y);
        y += c.Height;
     }
  }
0 голосов
/ 07 февраля 2016

Первый элемент не будет находиться в позиции 0, поскольку во время вычисления местоположений новый элемент не был добавлен в элементы управления панели. Кроме того, вы должны использовать AutoScrollPosition, чтобы отрегулировать позиции. Вот мое предложение:

        int pos = (Container.AutoScrollPosition.Y != 0 ? Container.AutoScrollPosition.Y - newitem.Height : 0);

        if (Container.Controls.Count > 0)
        {
            foreach (Control c in Container.Controls)
            {
                c.Location = new Point(0, pos);
                pos += c.Height;
                }
            }                
        }
        newitem.Location = new Point(0, pos);
        Container.Controls.Add(newitem);
...