winforms 无法访问当前示例以更改标签

kqlmhetl  于 2023-01-02  发布在  其他
关注(0)|答案(2)|浏览(114)

我想更改主窗体中函数类的标签文本。我想我可以缩小问题的范围,但找不到好的解决方案。可能我误解了WinForms中的示例。
最喜欢的溶液表1

public static Form1 f1Instance;
public Label lbl;
public Form1()
{
    InitializeComponent();
    f1Instance = this;
    lbl = label1;   //label1 = made by designer
}

类1(问题是我把函数放在类中而不是winform中吗?)

public void changeLblTxt(string txt)
{
    Form1.f1Instance.lbl.Text = txt;
}

但是这样做不起作用,我不明白为什么。这样做不是调用了Form1当前显示的示例吗?
适用于表1的解决方案

public static Form1 f1Instance;
public Label lbl;
public Form1()
{
    InitializeComponent();
    f1Instance = this;
    lbl = label1;    //label1 = made by designer
}

1类

public void changeLblTxt(string txt)
{
    Form1.f1Instance.lbl.Text = "Hello";
    Form1.f1Instance.Show();
}

但是我用它来多次调用Form1,不是吗?这与更长的运行时间和更多的交互不太匹配,不是吗?
我已经找到了无数关于这个主题的文章,但没有一篇能帮上忙。有人知道有一篇文章展示了一个很好的解决方案吗?

bf1o4zei

bf1o4zei1#

如果你有一个与表单交互的类,那么这个类应该有一个对表单示例的引用。使用静态字段和列表来尝试获取“当前”表单示例似乎是一个糟糕的设计。
我将把form示例交给类:

class Class1 {
   private Form1 form1;
   public Class1(Form1 form1) {
       this.form1 = form1;
   }
   // other stuff 
}

Form1 frm = new Form1();
Class1 cls1 = new Class1(frm);
cls1.changeLblTxt("Test");

如果你有两种形式:

class Form2: Form {
   private Form1 form1;
   public Form2(Form1 form1) {
       this.form1 = form1;
   }
   // other stuff 
}

Form1 frm1 = new Form1();
Form2 frm2 = new Form2(frm1);
fmr2.someMethod("Test");
qyuhtwio

qyuhtwio2#

在和chatgpt聊天后我发现了一个方法:表格1

public static List<Form1> formList = new List<Form1>();
public FormSettings()
{
    InitializeComponent();
    formList.Add(this);
}

表格2

public void someMethod()
{
    Form1 f1 = Form1.formList[0];
    fs.SetLabelText(lines[i]);
}

有人能给我解释一下为什么这个列表可以工作,但是直接赋值(首先尝试解决它)不起作用吗?据我所知,我也做过同样的事情。

相关问题