Панель прокрутки заставляет элементы управления появляться на полпути вниз панели - PullRequest
1 голос
/ 19 июля 2010

У меня здесь странная проблема. У меня есть панель winforms, которая программно имеет метки и пользовательский контроль (который может сворачиваться / расширяться). Пользовательские элементы управления находятся в группах, где метки входят в него. Из-за размера и количества элементов управления я установил панель для поддержки прокрутки.

Пока все хорошо: проблема возникает, когда панель прокручивается вниз сверху. Любые манипуляции с элементами управления на панели приводят к мертвому пространству (пустому) вверху.

Манипуляция происходит следующим образом:

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

Итерация происходит через группы, а затем через экземпляры этого пользовательского элемента управления, чтобы гарантировать их правильную группировку (Я надеюсь, что это объяснение имеет смысл)

Мой метод перестановки включен ниже:

  private void RearrangeControls()
  {
     Console.WriteLine(String.Format("Top of panel: {0}", pnlMain.Top));
     this.SuspendLayout();
     //sort ranges in to ascending order, this is the primary grouping
     _lRanges.Sort(CompareStringAscending);

     //now sort items by alphabetical order, we will filter out groups later so this will not be a problem
     _lItems.Sort(CompareSelectionDetailViewAscending);

     int iYPos = 0;

     //first sort through by 
     foreach (string selectedRange in _lRanges)
     {
        int iRangeControlCount = 0;

        KryptonLabel label = pnlMain.Controls[selectedRange] as KryptonLabel;
        label.Location = new Point(_iTitleIndent, iYPos);

        iYPos += label.Height + _iControlSpacing;

        //now sort views
        foreach (SelectionDetailView selectionDetailView in _lItems)
        {
           if (selectionDetailView.Range == selectedRange)
           {
              selectionDetailView.Location = new Point(_iDetailIndent, iYPos);
              //Console.WriteLine(String.Format("{0} {1} {2}", selectionDetailView.Name, selectionDetailView.Location.X.ToString(), selectionDetailView.Location.Y.ToString()));
              iYPos += selectionDetailView.Height + _iControlSpacing;

              iRangeControlCount++;
           }
        }

        //if this is zero, then it meant the last label we aded has no controls associated wiht it.  If this is the case we shoudl remove it from the panel
        if (iRangeControlCount == 0)
        {
           iYPos -= label.Height + _iControlSpacing;
           pnlMain.Controls.Remove(label);
        }

        Console.WriteLine(String.Format("Y: {0}", iYPos));
     }

     pnlMain.ScrollControlIntoView(_oSelectedItem);
     this.ResumeLayout();
  }

Все значения Y всех элементов управления на этой панели начинаются с 0, поэтому они должны быть сверху. Я искал вокруг и не смог найти никакой информации о том, что это за ошибка. Кто-нибудь знает, что происходит с этой штукой? Я был бы очень признателен за любые указания / помощь / совет по этому вопросу.

1 Ответ

2 голосов
/ 19 июля 2010

Проблема решена.

Мне нужно было использовать следующее:

int iYpos = pnlMain.AutoScrollPosition.Y

Если кто-нибудь еще столкнется с той же проблемой, надеюсь, это поможет.

(В этот момент я наконец-то рухнул перед клавиатурой - это был долгий день)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...