【问题标题】:how to open a second form only one time如何只打开一次第二个表单
【发布时间】:2021-06-04 16:41:52
【问题描述】:

我有一个包含两种形式的程序 第一个表单是主表单,是程序将从它开始的表单 第二种形式是只显示一次以接受价值观的形式,然后会回到第一种形式,第二种形式将关闭 注意:在开始时,程序将做一个从两个开始

  1. 如果值不在程序中,则显示第二个表单,然后关闭第二个并转到第一个。
  2. 如果程序具有值,则在其上显示第一个和县。

注意:当第二个表单出现时,第一个表单将被隐藏,然后程序从用户那里获取值后,第二个表单将关闭并显示第一个表单

换句话说,如果用户向程序提供第二个表单之前的值将不会出现,只会出现第一个表单

问题是在第二个表单取值后第一个表单打开时,第二个表单仍然打开

代码形式1

private void Form1_Load(object sender, EventArgs e)
{
    b();
}

private void b()
{
    Open();
    String SqlQuery = "SELECT * from test1";
    DataTable dt = new DataTable();
    dt = fetchData(SqlQuery);
    if (!(dt.Rows.Count >0))
    {
        MessageBox.Show("incorect user");
        fm2 = new Form2();                
        fm2.Show();
        this.Hide();
    }
}

代码形式2

public void fn()
{
    String SqlQuery = "SELECT * from test1 ";
    DataTable dt = new DataTable();
    dt = fetchData(SqlQuery);
    if (dt.Rows.Count > 0)
    {
        Application.OpenForms[0].Show();
        MessageBox.Show("DONE");
        this.Close();
    }
}

private void button1_Click(object sender, EventArgs e)
{
    string insertQuery = "INSERT INTO test1( name, phone) VALUES" +
        "('" + (textBox1.Text) + "','" + (textBox2.Text) + "')";

    ExcuteQuery(insertQuery);         
    fn();
}

我有一个问题,就是我让它隐藏在代码之后在后台运行的 form1 Application.OpenForms[0].Show();

【问题讨论】:

  • 仅供参考,如果您只是要在下一行重新分配dt = new DataTable();,那么分配dt = new DataTable(); 是没有意义的……您可以这样做DataTable dt = fetchData(SqlQuery);
  • 另外,您的代码对 SQL 注入是开放的;请使用命名参数,而不是将表单中的文本连接到查询字符串中。

标签: c# sql-server


【解决方案1】:

如果没有真正查看您的应用的详细信息。但是如果你不想在Form2关闭之前打开Form1,你应该改变:

fm2.Show();

fm2.ShowDialog();

【讨论】:

  • 当我把它改成 fm2.ShowDialog();表单没有关闭
  • 那你需要调试你的代码,见:Tutorial: Learn to debug C# code using Visual Studio。而且,请更准确地说,你有两个表格,你说“表格没有关闭”......这两种表格中的哪一个没有关闭?
  • 顺便说一句:当你调试你的代码时,你应该会发现这一行应该被删除Application.OpenForms[0].Show();
  • 对不起,我没有注意到我没有说哪个表单没有关闭。第二个没有关闭的form2
  • 我差不多知道了,但是我没有找到打开form1的命令。所以我说我会这样测试
【解决方案2】:
if (!(dt.Rows.Count > 1))

改成

if (!(dt.Rows.Count >0))

【讨论】:

  • 是的,我编辑它。它只是复制错误。我改了,有问题
【解决方案3】:

您可以尝试隐藏主窗体,然后将第二个窗体显示为对话框(这意味着代码流会转到第二个窗体,直到它关闭,然后从中断处继续)。你甚至可以循环执行,以防他们在没有输入用户的情况下关闭第二个表单:

Form1

string SqlQuery = "SELECT * from test1 ";
DataTable dt = fetchData(SqlQuery);

while (dt.Rows.Count == 0)
{
    this.Hide(); 
    MessageBox.Show("No users exist. Please add one.");    

    using (Form2 fm2 = new Form2())
    {
        fm2.ShowDialog(this);
    }

    dt = fetchData(SqlQuery);
}

this.Show();

然后在第二种形式中,您不必担心尝试显示第一种形式,因为第一种形式会在代码恢复时显示出来。

Form2

if (dt.Rows.Count > 0)
{
    MessageBox.Show("User added successfully.");
    this.Close();
}
else
{
    MessageBox.Show("No user was added. Please try again.");
}

如果您仍然遇到问题,则可能是 fetchDataExecuteQuery 无法正常工作。您应该验证在ExecuteQuery 之后确实将用户添加到SQL。

您还可以在代码中添加断点并在调试器中检查dt.RowsCount 属性,以确保fetchData 正常工作。

【讨论】:

  • 我尝试了你的代码,它的工作很好,但是在将值保存到数据库后,第二个表单没有关闭
  • 请提供更多信息 - 您的意思是 this.Close() 不会关闭表单吗?还是您的意思是Form2在数据库中有记录时仍然打开?
  • Form2 仍然打开,同时在数据库中添加了行
  • 您是否在代码中的其他任何地方打开表格 2? Open 是做什么的?
  • 不,我不打开它。函数 Open 只是为了打开连接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
相关资源
最近更新 更多