【问题标题】:Prevent Form from opening multiple times防止表单多次打开
【发布时间】:2015-01-29 07:20:35
【问题描述】:

因为我是 C# 新手,所以我认为这个问题有点愚蠢,但直到现在我还没有找到适合我遇到的问题的解决方案。 我有两个表格。在 Form1 中,我单击一个按钮,然后弹出一个 Form2,在那里可以看到一个 GridView。我所做的是:我在我的第一个 GridView (Form1) 中选择行,然后将所选行传递给 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 中选择更多行并再次点击按钮时,Form2 应该保持打开状态,并且应该将值添加到 GridView2 中的现有行中。在我的例子中,打开了一个新的 Form2,并将其他行放入新的 Form2 中。我知道我应该检查对象是否已经创建或将它移到某个地方但是如何?我得到了例外而不是例外。

【问题讨论】:

  • 您可以使用 Delegate 和 Events 在 2 个表单之间进行出色的通信...

标签: c# winforms forms


【解决方案1】:

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;
    }
}

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

【讨论】:

  • 第三行不起作用,因为我在Form2中的构造函数是: public Form2(Form1 frm1) { InitializeComponent(); form1 = frm1 } - 所以“new Form2()”中必须有一个参数
  • @MKX2015,是否将 Form1 frm1 对象用于任何其他目的?
  • 不是直接frm1。我用它使 Form1 成为父表单并调用第二个表单。是否需要新的构造函数或应该在 new Form2() 中传递什么?
  • @MK2015, 公共表格2 f;公共 Form1() { InitializeComponent(); f = 新 Form2(this); }
  • 好的,所以当我现在单击按钮而不选择时,他会打开带有 GridView 的表单。当我选择一些东西时,我在 form2.Show() 行上得到一个“System.ObjectDisposedException”
【解决方案2】:

您需要在方法之外声明 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);
}

【讨论】:

  • 已经试过了。这对我不起作用。 var 未定义。 “this”不可用,在我的方法中“form2”很友好。
  • 对不起,我懒,1秒
  • @MKX2015 - 没有收到this,您需要在表单的构造函数中声明它
  • 好的,我试过了:public Form1(Form2 frm2) { frm2 = form2; } 但我得到一个 NullReference 异常。怎么称呼?
  • @MKX2015 - 我很困惑frm2 在那个 sn-p 中来自哪里(而且你的声明方式错误(form2 = frm2)
【解决方案3】:

我正在考虑 3 种方法。

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

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

  3. 从 Form1 中找出额外的选择,只将 addtionals 传递给 Form2,并且只将额外的添加到 Form2 上的 GridView。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多