C# 子窗体在enter单击时关闭

C# 子窗体在enter单击时关闭,c#,winforms,keyup,C#,Winforms,Keyup,我有两种形式Frm1和Frm2 两者都有一个文本框 在第一个表单的keyup事件textbox,如果KeyChar是ENTER,则打开第二个表单 现在,在第二个表单中的KeyUp事件textbox中,我将关闭此表单,即提交 现在这两个事件都被称为。有没有办法摆脱它 private void textBox1_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter)

我有两种形式
Frm1
Frm2

两者都有一个
文本框

在第一个表单的
keyup
事件
textbox
,如果
KeyChar
ENTER,则打开第二个表单

现在,在第二个表单中的
KeyUp
事件
textbox
中,我将关闭此表单,即提交

现在这两个事件都被称为。有没有办法摆脱它

 private void textBox1_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                Frm2 frm=new Frm2();
                Frm2.RefToForm1=this;
                frm.StartPosition = FormStartPosition.CenterParent;
                frm.ShowDialog(this);
            }

        }
现在是二年级

private void textBox2_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
               this.RefToForm1.textBox1.Text=textBox2.Text;
                this.Close()
            }

        }
问题是当我在
textBox1
上按enter键时,
form2
会立即打开和关闭


任何解决方案

在表单2中定义布尔变量,最初将其设置为false,然后基于该变量关闭表单。您可以稍后在需要时将其设置为true。您可以使用textbox的GotFocus方法将其设置为true。e、 g

    textBox2.GotFocus += textBox2_GotFocus; 
在textBox2_GotFocus方法中,将布尔值设置为true。您的密钥更新方法如下所示:

    private void textBox2_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
           if(boolean_var){
               this.RefToForm1.textBox1.Text=textBox2.Text;
               this.Close();
           }
        }

    }

textBox1
处于焦点且尚未打开
Frm2
实例时,释放Enter键也不会引发
Frm2
textBox2
上的
KeyUp
事件

您确定项目中没有导致此行为的附加代码吗?您是否尝试在
textBox2\u GotFocus
方法中的
this.Close()
上设置断点,以查看它是否在您的场景中实际执行

我甚至使用您的代码创建了一个小样本项目,并对其进行了一些小的修改(在注释中解释):


您可以从下载此工作示例项目。

如果文本框为空,您可能会阻止第二个表单关闭——假设需要有东西进入其中才能关闭


你能告诉我们更多关于你想用这个做什么的信息吗?也许有另一种方法可以解决您试图创建的功能

您可以为设置windows窗体属性-

1-
AcceptButton
-按钮id(您必须在哪个按钮上提交。)
2-
CancelButton
-按钮id(必须关闭窗体的按钮)。

您可以在第二个窗体中保留布尔值,并根据其值关闭窗体。e、 g最初将其定义为false,并在以后需要时将其设置为true。但是我在哪里可以将该值设置为true,即在哪个事件上。我正在将值从第一个文本框传递到第二个文本框is
RefToForm1
static?那么这是什么
Frm2。RefToForm1=this?您如何将
form1
引用直接分配给类属性
Frm2.RefToForm1
,而不实例化它?@Nitin Varpe我不确定,但必须有一些方法用于texbox焦点,例如onFocus或类似的方法。你可以在里面设置为true。是的,我已经通过设置断点进行了检查。我不知道你到底给出了什么解决方案?我想,大多数人如果只运行这两个代码块(textbox1和textbox2 keyUp事件的事件处理程序),就会得到正确的结果。我还尝试了代码,form2的行为符合预期(在我再次按下enter键之前,它不会关闭)。因此,正如@Damir所建议的,您可能需要进一步调试,并检查您的代码中是否有任何其他部分触发了您所述的错误行为。@NitinVarpe当我的示例开始时,
Form1
textBox1
中以焦点打开。按Enter键,将在
textBox2
中以焦点打开
Frm2
。它将保持打开状态,直到再次按Enter键,然后关闭。也许我没有正确地理解您,但您的问题是,
Frm2
刚刚立即关闭吗?thanx@DamirArh,我已经解决了表单AcceptButton属性的问题,实际上我正在将值从txt1传递到txt2,因此无法检查空字符串,并且我的项目更大。我只说了一种情况。要知道打开哪个表单,有很多检查
private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        Frm2 frm=new Frm2();
        frm.RefToForm1=this; // you said RefToForm1 isn't static and it shouldn't be
        frm.StartPosition = FormStartPosition.CenterParent;
        frm.ShowDialog(this);
    }
}

private void textBox2_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        this.RefToForm1.textBox1.Text=textBox2.Text;
        this.Close(); // missing semicolon
    }
}

public Form1 RefToForm1 { get; set; } // property in Frm2