C#one表单即时访问控件

时间:2015-03-06 14:17:22

标签: c# forms controls

我有以下代码检查表单的瞬间是否打开。但是,如果表单已经打开,我无法访问控件(DataGridView dgvPDF):

            Form frmPDF = Application.OpenForms["frmPDFs"];
            if (frmPDF != null)
            {
                frmPDF.Focus();
                frmPDF.dgvPDF.DataSource = PDF.CheckPDFs(Files, frmPDF.tblPDFs); <--- red squiggly lines

            }
            else
            {
                frmPDFs frmPDF1 = new frmPDFs();
                frmPDF1.Show();
                frmPDF1.dgvPDF.DataSource = PDF.CheckPDFs(Files, frmPDF1.tblPDFs);
            }

错误消息是:

  

错误1'System.Windows.Forms.Form'不包含的定义   'dgvPDF'并没有接受第一个参数的扩展方法'dgvPDF'   可以找到'System.Windows.Forms.Form'类型(你错过了吗?   使用指令或程序集引用?)

1 个答案:

答案 0 :(得分:0)

这是一个强类型变量:

Form frmPDF = Application.OpenForms["frmPDFs"];

所以frmPDF现在是Form类型的实例,它是表单的基类。它的不是您实际表单的类型。 (它是您特定表单类型的实例,但在这种情况下,编译器将该实例称为其基本类型。)

您的实际形式是什么类型?我们暂时假设Form1。然后将其输入:

Form1 frmPDF = (Form1)Application.OpenForms["frmPDFs"];

然后,您可以访问Form1上的frmPDF类型的公开成员。


修改:根据您在下面的评论,类型为frmPDFs。所以使用:

frmPDFs frmPDF = (frmPDFs)Application.OpenForms["frmPDFs"];

编辑:顺便说一下,施法可能很危险。您可以包含一些类型检查并更优雅地处理错误:

frmPDFs frmPDF = Application.OpenForms["frmPDFs"] as frmPDFs
if (frmPDF == null)
{
    // the form was the wrong type, something isn't right
}