防止表单多次打开

Prevent Form from opening multiple times

因为我是 C# 的新手,所以我认为这个问题有点愚蠢,但直到现在我还没有找到适合我遇到的问题的解决方案。 我有两个表格。在 Form1 中,我单击一个按钮,然后弹出一个 Form2,其中可以看到一个 GridView。我所做的是:我在我的第一个 GridView (Form1) 中 select 行,然后将 selected 行传递给 Form2 中的 GridView2。第一次成功。

  private void selectRows_Click(object sender, EventArgs e)
    {
        var form2 = new Form2(this);

        form2.select_rows(sender);

        if (form2.Visible)
        {
            form2.Close();
        }
        form2.Show(this);
    }

但现在我不知道如何正确地做到这一点。当我在我的 GridView1 中 select 更多行并第二次点击按钮时,Form2 应该保持打开状态,并且应该将值添加到 GridView2 中的现有值。在我的例子中,一个新的 Form2 打开,额外的行被放入新的 Form2。我知道我应该检查该对象是否已经创建或将其移出某处但是如何?我得到了例外超过例外。

您需要在方法外部声明 form2,然后像您已经在做的那样在方法内部引用它,您不想关闭表单,只需将其隐藏即可。也许甚至不是。

您也需要将声明移动到 Form1 的构造函数中

Form2 form2;
public Form1()
{
    form2 = new Form2(this);
}

private void selectRows_Click(object sender, EventArgs e)
{
    if(form2 == null)
        form2 = new Form2(this);

    form2.select_rows(sender);
    form2.Show(this);
}

Form1.cs

public partial class Form1 : Form
{      
    public Form2 f = new Form2();
    public Form1()
    {
        InitializeComponent();           
    }

    private void button1_Click(object sender, EventArgs e)
    {

        f.Show();
        f.dataGridView2.Rows.Clear();
        foreach (DataGridViewRow d in dataGridView1.SelectedRows)
        {
            f.dataGridView2.Rows.Add(new object[] { d.Cells[0].Value.ToString(), d.Cells[1].Value.ToString() });
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        dataGridView1.Rows.Add(new object[] { "1", "aaaa" });
        dataGridView1.Rows.Add(new object[] { "2", "bbbb" });
        dataGridView1.Rows.Add(new object[] { "3", "cccc"});
        dataGridView1.Rows.Add(new object[] { "4", "dddd"});
    }
}

Form2.cs

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

          private void Form2_FormClosing(object sender, FormClosingEventArgs e)
    {
        this.Hide();           
        e.Cancel = true;
    }
}

试试这个...希望对您有所帮助...

我正在考虑 3 种方法。

  1. 关闭第一个 Form2 并使用新值打开一个新的(第二个)Form2(可能是最简单的方法)

  2. 清除 Form2 上的 GridView 并用新值重新填充 GridView

  3. 从Form1中找出附加项,只将附加项传递给Form2,只将附加项添加到Form2上的GridView。