C# 如何使用form.Activate()传递参数;而不是form.Show();
在总账中,当用户双击dgv行时,将打开采购发票表单,其中包含相关的采购发票。如果采购发票已经在MDIPARENT中打开,它将被激活,在这种情况下,我将应用检查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
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的上述评论。这是一个糟糕的设计。如果你有更好的想法,请告诉我,还有什么其他方法可以做到这一点。