使用this.Hide();后无法重新打开表单。或this.Close();

时间:2019-06-13 10:19:26

标签: c# winforms

我正在编写一些代码,该代码使用TreeView中的AfterSelect行为,然后使用所选的Nodes名称和标记打开一个表单。它可以完美地工作,但是缺点是,无论何时使用this.Close();this.Hide();或什至使用内置的Windows关闭按钮关闭表单,我都必须先打开另一个表单才能重新打开同一表单。 / p>

我尝试使用不同的行为方法,例如NodeMouseClickNodeMouseDoubleClick,但这仍然会导致对象错误,因此我认为这不是我需要的方法

这是我在树状视图中的代码:

public void TreeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
    string formName = treeView1.SelectedNode.Name.ToString();
    string namespaceName = treeView1.SelectedNode.Tag.ToString();
    var type = Type.GetType(namespaceName + "." + formName);
    var newForm = Activator.CreateInstance(type) as Form;
    if (newForm != null)
    {
        newForm.ShowDialog();
    }
}

这是表单中的代码:

private void BtnSave_Click(object sender, EventArgs e)
{
    AccessDBConnection.sql = "INSERT INTO Users (FirstName, Surname, Username) values(@FirstName, @Surname, @Username)";
    AccessDBConnection.cmd.Parameters.Clear();
    AccessDBConnection.cmd.CommandType = CommandType.Text;
    AccessDBConnection.cmd.CommandText = AccessDBConnection.sql;
    AccessDBConnection.cmd.Parameters.AddWithValue("@FirstName", firstNameBox.Text);
    AccessDBConnection.cmd.Parameters.AddWithValue("@Surname", surnameBox.Text);
    AccessDBConnection.cmd.Parameters.AddWithValue("@Username", usernameBox.Text);
    AccessDBConnection.openConnection();

    AccessDBConnection.cmd.ExecuteNonQuery();
    AccessDBConnection.closedConnection();
    MyMessageBox.ShowMessage("User Created.", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Hand);
    //this.Hide();
    //this.Close();
    //Commented out as using Windows Close Button for testing.
}

我应该能够打开表格Add User,然后完成详细信息,按Submit / close,然后如果需要再次访问同一表格,但是在打开之前,我无法重新打开同一表格另一个第一,例如User Maintenance

没有错误消息。

1 个答案:

答案 0 :(得分:0)

您真的需要代码的这一部分吗?

var type = Type.GetType(namespaceName + "." + formName);
var newForm = Activator.CreateInstance(type) as Form;

如果没有,则需要考虑一下,如果在每个afterselect中将var声明为新Form,则在隐藏它时就无法将其恢复为旧状态,因为创建了新实例。 / p>

如果您始终想要此窗口的新实例,请执行以下操作:

public void TreeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
    string formName = treeView1.SelectedNode.Name.ToString();
    string namespaceName = treeView1.SelectedNode.Tag.ToString();
    var newForm = new FORMNAME();
    newForm.ShowDialog();
}

以及另一种形式:

Close(); // this. is redundant

如果您只想隐藏它而不总是将其声明为新实例: 声明

var newForm = new FORMNAME();

在其他地方并以其他形式使用:

Hide();