окна формы: программная прокрутка - PullRequest
3 голосов
/ 19 марта 2012

Я занимаюсь разработкой приложения для форм Windows. И у меня есть следующая проблема: в форме есть панель, и в этой панели у меня есть несколько элементов управления (просто метка с текстовым полем, число определяется во время выполнения). Размер этой панели меньше суммы всех динамически добавляемых элементов управления. Итак, мне нужен свиток. Идея такова: когда пользователь открывает форму: первый элемент управления должен быть сфокусирован, пользователь вводит текст и нажимает клавишу ввода, следующий элемент управления должен быть сфокусирован и так до завершения.

Что ж, вполне вероятно, что не все элементы управления помещаются на панель, поэтому я хочу, чтобы, когда элемент управления внутри панели получил фокус, панель прокручивается, чтобы позволить пользователю увидеть элемент управления и позволить ему увидеть, что он вводит в текстовое поле.

Я надеюсь, что будет ясно.

вот код, который используется для генерации элементов управления и добавления к панели:

    List<String> titles = this.BancaService.ValuesTitle();
    int position = 0;
    foreach (String title in titles)
    {
         BancaInputControl control = new BancaInputControl(title);
         control.OnInputGotFocus = (c) => {
                 //pnBancaInputContainer.VerticalScroll.Value = 40;
                 //pnBancaInputContainer.AutoScrollOffset = new Point(0, c.Top);
                 // HERE, WHAT CAN I DO?
                 };
         control.Top = position;
         this.pnBancaInputContainer.Controls.Add(control);
         position += 10 + control.Height;
    }

1 Ответ

3 голосов
/ 19 марта 2012

Если вы установите AutoScroll в значение true, это будет выполнено автоматически. Что касается идеи, что Enter должен переместить фокус в следующее поле, лучшим решением было бы выполнить ввод, как если бы это была клавиша TAB в BancaInputControl :

protected override void OnKeyDown(KeyEventArgs e)
{
    base.OnKeyDown(e);

    if (e.KeyCode == Keys.Enter)
    {
        e.Handled = true;
        //  Move focus to next control in parent container
        Parent.SelectNextControl(this, true, true, false, false);
    }
}

Если BancaInputControl является составным элементом управления (UserControl, содержащий другие элементы управления), каждый дочерний элемент управления должен подключить событие KeyDown к этому обработчику. Он пытается переместить фокус на следующий элемент управления в BancaInputControl ; в случае неудачи перемещает фокус на следующий элемент управления родительского контейнера.

private void textBox_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        e.Handled = true;
        if (!SelectNextControl((Control)sender, true, true, false, false))
        {
            Parent.SelectNextControl(this, true, true, false, false);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...