C # UserControl.VerticalScroll.Value не устанавливается - PullRequest
5 голосов
/ 16 апреля 2009

У меня есть кусок кода на C #, который должен устанавливать VerticalScroll.Value в классе, который наследуется от UserControl. Он вызывается, когда любой дочерний объект класса меняет размеры. У класса свойство AutoScroll установлено в значение true.

    public void ScrollTo(int top)
    {
        if (top >= this.VerticalScroll.Minimum && top <= this.VerticalScroll.Maximum)
        {
            this.VerticalScroll.Value = top;
        }
    }

Проблема в том, что при трассировке кода иногда устанавливается this.VerticalScroll.Value, иногда он сохраняет значение, которое было до вызова этого метода.

Это ошибка в VS, или есть известные условия, при которых значение будет игнорировать попытки установить его?

Спасибо, Rob

Ответы [ 4 ]

20 голосов
/ 17 июня 2009

У меня была такая же проблема, и я нашел решение на каком-то форуме разработчиков. После установки VerticalScroll.Value необходимо вызвать PerformLayout (), чтобы обновить элемент управления прокрутки. Так что сделайте это:

scrollingcontrol.VerticalScroll.Value = top;
scrollingcontrol.PerformLayout();

Это имеет больше смысла, чем установка. Значение дважды, хотя, похоже, он имеет тот же эффект.

3 голосов
/ 20 мая 2009

У меня возникла та же проблема, и я нашел решение на веб-странице MSDN (я не буду публиковать ссылки, потому что я новый пользователь).

Предложенным решением было присвоить .Value дважды, и у меня это сработало:

int newVerticalScrollValue = 
         pDashboard.VerticalScroll.Value - pDashboard.VerticalScroll.SmallChange;

pDashboard.VerticalScroll.Value = newVerticalScrollValue;
pDashboard.VerticalScroll.Value = newVerticalScrollValue;
0 голосов
/ 13 марта 2015

В моем случае необходимо было установить VerticalScroll.Value на другое значение, а затем на интересующее значение, например,

this.panel1.VerticalScroll.Value = verticalScrollPosition - 1;
this.panel1.VerticalScroll.Value = verticalScrollPosition;   

Позаботьтесь о том, чтобы положение прокрутки всегда находилось между VerticalScroll.Minimum и VerticalScroll.Maximum.

0 голосов
/ 29 июля 2014

FlowLayoutPanel, похоже, другой зверь. Полоса прокрутки перемещается вниз, но значение flowlayoutpanel.VerticalScroll.Value остается равным 0. Я испробовал все вышеперечисленные методы плюс некоторые DoEvents () и Thread.Sleep (), даже таймер, который полностью сдался, прежде чем выполнять следующую итерацию. Это все не удалось. В конце концов я обнаружил, что DisplayRectangle.Y мгновенно выражает изменение прокрутки ...

private void PrintButton_Click(object sender, EventArgs e)
{
    FlowLayoutPanel flp = TheBuildFlowLayoutPanel;
    List<Bitmap> printPics = new List<Bitmap>();
    int printLastY = 100;
    flp.VerticalScroll.Value = 0;
    while (flp.DisplayRectangle.Y < printLastY) // DisplayRect.Y becomes successively more negative
    {
        Bitmap bmp = new Bitmap(flp.Width, flp.Bounds.Height);
        printPics.Add(bmp);
        flp.DrawToBitmap(bmp, flp.ClientRectangle);
        printLastY = flp.DisplayRectangle.Y;
        flp.VerticalScroll.Value = Math.Min(flp.VerticalScroll.Maximum, flp.VerticalScroll.Value + flp.Height);
    }

    flp.VerticalScroll.Value = 0;
    for (int i = 0; i < printPics.Count; i++)
    {
        printPics[i].Save("C:\\Temp" + i.ToString() + ".bmp");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...