2012-03-19 110 views
3

我正在开发一个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; 
    } 
+0

那么你想要一个滚动动画?或者只是重新定位/切换某些控件的可见性? – SkonJeet 2012-03-19 13:04:31

+0

谢谢,只有当他们获得焦点时控件的可见性 – 2012-03-19 13:21:15

回答

3

如果设置AutoScroll为true,这将是自动的照顾。至于该输入应该将焦点移动到下一个字段的想法,最好的解决办法是执行进入,就好像是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是复合控件(包含用户控件其他控件),每个子控件应该将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); 
     } 
    } 
} 
相关问题