创建一个新窗口对象,需要确定窗口的位置,比如贴附到某个控件,并且需要在两个窗口间传值。特定位置可以将子窗口的FormStartPositon设定为Manual,然后修改窗口的Location;父窗口给子窗口传值容易,子窗口要传递值给父窗口,则需要在子窗口中自定义一个公共访问值,相当于一个自定义属性,这样父窗口就可以读取。为避免子窗口重复创建,可以使用ShowDialog方法,设定子窗口的返回值为DialogResult.OK,这样就可以像MessageBox.Show()方法一样调用完成后直接关闭了。
//子窗口设定一个父窗口可访问的属性值
public string curInput { get; set; }
//子窗口中设定点击确定按钮后返回DialogResult.OK
private void btnConfirm_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.OK;
}
//父窗口做一个公共调用函数,这样任意一个文本框都能调用
public void getNumInput(object sender,EventArgs e)
{
TextBox textbox = (TextBox)sender;
frmNumInput frmNum = new frmNumInput();
frmNum.Text = frmNum.curInput = textbox.Text;
//设定窗口启动位置为手动
frmNum.StartPosition = FormStartPosition.Manual;
//相对于当前窗口当前容器的位置,有偏差的话可以调试运行后加上数值微调
int ptX = this.Left + this.tabSubject.Left + textbox.Left + 5;
int ptY = this.Top + this.tabSubject.Top + textbox.Top + 90;
frmNum.Location = new Point(ptX, ptY);
//创建一个模式窗口,调用完就自动关闭,不用再考虑Close方法
if (frmNum.ShowDialog() == DialogResult.OK)
{
textbox.Text = frmNum.curInput;
}
}