C# 一种形式的即时访问控制

C# one form instant access 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);
            }

错误信息是:

Error 1 'System.Windows.Forms.Form' does not contain a definition for 'dgvPDF' and no extension method 'dgvPDF' accepting a first argument of type 'System.Windows.Forms.Form' could be found (are you missing a using directive or an assembly reference?)

这是一个强类型变量:

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

因此 frmPDF 现在是类型 Form 的一个实例,它是您表单的 base class。它不是您实际表单的类型。 (它是您的特定表单类型的一个实例,但在这种情况下,该实例被编译器视为其基本类型。)

你的实际形态是什么类型?让我们暂时假设它是 Form1。然后将其设为:

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

然后您可以在 frmPDF 上访问 public 类型 Form1 的成员。


编辑: 根据您在下方的评论,类型为 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
}