在winform中从另一个访问控件

问题描述

这段代码有什么问题?我想在 tabPage3 中的 tabControl1 中更改 Form1 中的标签

private void FormInsertDanascores_FormClosing(object sender,FormClosingEventArgs e)
{
    Form1 frm = new Form1();
    foreach (Control c in frm.Controls)
    {
        foreach (TabPage TabPage in tabControl1.TabPages)
        {
            foreach (Control control in TabPage.Controls)
            {
                if (control.Name == "lblInsertEditscores")
                {
                    
                    ((Label)(c)).BackColor = Color.Transparent;
                    ((Label)(c)).Text = "jjjjjj";
                    frm.Refresh();
                }
            }
           
        }
    }

}

解决方法

读取 Form1 frm = new Form1(); 的行是您的问题。您正在生成一个全新版本的表单,并更改该新表单上的标签。相反,尝试存储对要更改的表单的引用,或者将其作为当前控件的父级获取。

,

与遍历所有标签并检查名称不同,您可能会更改受影响标签的可访问性并将其设为 public,例如。你的代码就这么简单

Form1 frm = new Form1();
from.lblInsertEditScores.BackColor = Color.Transparent;
from.lblInsertEditScores.Text = "jjjjjj";

接下来是 new 创建一个新对象,即一个新窗口。但是你永远不会显示那个新窗口。我的猜测是你已经有这样一个窗口,你不想再创建一个。因此,您应该使用现有的而不是创建一个新的。

因此在 FormInsertDanaScores 中创建一个新属性,例如

public Form1 frm;

并在您创建 FormInsertDanaScores 后分配它。您没有显示该代码,但它可能看起来像

Form1 frm = new Form1();
frm.Show();

var danaScores = new FormInsertDanaScores();
danaScores.frm = frm;
danaScores.Show();

这个命名远非完美,顺便说一句。 Form1 是一个糟糕的类名,frm 也太笼统了。这些名字应该表达一些有意义的东西。

如果 Form1 已经打开并且您从 Form1 内部显示附加窗口,您的代码可能如下所示:

var danaScores = new FormInsertDanaScores();
danaScores.frm = this;
danaScores.ShowDialog();