C# 如何使用form.Activate()传递参数;而不是form.Show();

C# 如何使用form.Activate()传递参数;而不是form.Show();,c#,winforms,c#-4.0,c#-3.0,C#,Winforms,C# 4.0,C# 3.0,在总账中,当用户双击dgv行时,将打开采购发票表单,其中包含相关的采购发票。如果采购发票已经在MDIPARENT中打开,它将被激活,在这种情况下,我将应用检查 private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { string invNo = dataGridView1.SelectedRows[0].Cells[1].Value.ToString(); forea

在总账中,当用户双击dgv行时,将打开采购发票表单,其中包含相关的采购发票。如果采购发票已经在MDIPARENT中打开,它将被激活,在这种情况下,我将应用检查

private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
  string invNo = dataGridView1.SelectedRows[0].Cells[1].Value.ToString();
  foreach (Form f in Application.OpenForms)
  {
    if (f.GetType() == typeof(PurchaseForm ))
    {
      f.Visible = true;
      f.Activate();
      .....
    }
   ....
  }
  ....
}
我想传递参数



它不工作,不能传递参数,这有什么解决办法

   return;
        }
   }

   PurchaseForm form = new PurchaseForm();
   form.MdiParent = MainForm.ActiveForm;
   form.Show();

   form.btnNewInvoice.PerformClick();
   form.txtInvoiceNo.Text = invNo;
   form.dataGridView1.Focus();
}

不确定,但在我看来,您希望执行以下代码:

form.btnNewInvoice.PerformClick();
form.txtInvoiceNo.Text = invNo;
form.dataGridView1.Focus();
当窗体已打开时。您会说,“它不工作,无法传递参数”。您很可能在下面的代码段中尝试使用“f”

if (f.GetType() == typeof(PurchaseForm ))
{
  f.Visible = true;
  f.Activate();
  .....
}
如果是,只需将“f”转换为如下所示的PurchaseForm:

if (f.GetType() == typeof(PurchaseForm ))
{
  PurchaseForm pf = (PurchaseForm)f;

  pf.btnNewInvoice.PerformClick();
  pf.txtInvoiceNo.Text = invNo;
  pf.dataGridView1.Focus();

  pf.Visible = true;
  pf.Activate();
  .....
}
public partial class PurchaseForm : Form
{

    public void SetInvoiceNumber(string invNo)
    {
        this.Visible = true;
        this.Activate();

        this.txtInvoiceNo.Text = invNo;
        this.btnNewInvoice.PerformClick();
        this.dataGridView1.Focus();
    }

}
编辑:Servy正在谈论的简单示例

基本上,您需要创建一个公共方法来接收发票号。该方法可以访问控件并直接设置值。大概是这样的:

if (f.GetType() == typeof(PurchaseForm ))
{
  PurchaseForm pf = (PurchaseForm)f;

  pf.btnNewInvoice.PerformClick();
  pf.txtInvoiceNo.Text = invNo;
  pf.dataGridView1.Focus();

  pf.Visible = true;
  pf.Activate();
  .....
}
public partial class PurchaseForm : Form
{

    public void SetInvoiceNumber(string invNo)
    {
        this.Visible = true;
        this.Activate();

        this.txtInvoiceNo.Text = invNo;
        this.btnNewInvoice.PerformClick();
        this.dataGridView1.Focus();
    }

}
然后,在将“f”转换为PurchaseForm(如前所示)后,您只需执行以下操作:

if (f.GetType() == typeof(PurchaseForm ))
{
  PurchaseForm pf = (PurchaseForm)f;
  pf.SetInvoiceNumber(invNo);
}

只需在表单类中添加一个构造函数或一个公共方法,就可以让您传递任何您想要的内容;表单应该只公开只允许调用外部调用方需要执行的功能的方法/属性,然后表单本身应该担心对其内部控件的操作;它们应该是实现细节,而不是公共API的一部分。另外,与其在
openforms
中查找表单,不如使用一个私有字段,其中包含已打开表单的实例。很高兴听到这个消息。不过,我同意Servy的上述评论。这是一个糟糕的设计。如果你有更好的想法,请告诉我,还有什么其他方法可以做到这一点。