我正在开发 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;
}
最佳答案
如果你设置AutoScroll为真,这将自动处理。至于 Enter 应该将焦点移动到下一个字段的想法,最好的解决方案是执行 enter 就好像它是 BancaInputControl 中的 TAB 键:
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);
}
}
}
关于c# - 窗体 : scroll programmatically,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9770136/