使用C#.NET从另一个类访问Windows应用程序对象

使用C#.NET从另一个类访问Windows应用程序对象,c#,.net,class,windows,C#,.net,Class,Windows,我有一个简单的windows应用程序,其中有一个带有一些按钮和标签的窗口,还有几个其他类 我的问题是类中有一些方法,我想在其中更新一些主窗体中的标签。如何可以直接从类访问标签 谢谢 编辑:一小段代码将有所帮助您可以只发送对包含标签的表单的引用,或对标签本身的引用,但这会将您的代码链接到GUI,因此我不推荐这样做。相反,我建议在创建事件的类中,在需要更新时引发事件,然后设置表单,以侦听这些事件并根据需要更新GUI 我假设这些类是“工作者”类,其方法在某种程度上由表单调用。您可以只发送一个对表单的引

我有一个简单的windows应用程序,其中有一个带有一些按钮和标签的窗口,还有几个其他类

我的问题是类中有一些方法,我想在其中更新一些主窗体中的标签。如何可以直接从类访问标签

谢谢


编辑:一小段代码将有所帮助

您可以只发送对包含标签的
表单的引用,或对标签本身的引用,但这会将您的代码链接到GUI,因此我不推荐这样做。相反,我建议在创建事件的类中,在需要更新时引发事件,然后设置
表单
,以侦听这些事件并根据需要更新GUI


我假设这些类是“工作者”类,其方法在某种程度上由
表单调用。

您可以只发送一个对
表单的引用,该表单包含标签,或对标签本身的引用,但它将您的代码链接到您的GUI,因此我不推荐它。相反,我建议在创建事件的类中,在需要更新时引发事件,然后设置
表单
,以侦听这些事件并根据需要更新GUI


我假设类是“工作者”类,其方法由
表单以某种方式调用。

默认情况下表单上的标签是私有的(如果从设计器添加)
一种可能性(不推荐)是将其更改为公共。

更好的选择是添加属性/方法来设置它们的值。

默认情况下,表单上的标签是私有的(如果从设计器添加)
一种可能性(不推荐)是将其更改为公共。

一个更好的选择是添加属性/方法来设置它们的值。

为什么不直接在表单的控件集合中查找,或者使用控件ID作为标识符

public class LabelChanger
{
  public static void SetLabelText(Form form, string labelID, string labelText)
  {
    Label lbl = form.Controls["labelID"] as Label;
    if(lbl != null)
      lbl.Text = labelText;
  }
}
然后,给你一张表格,你可以这样做-

Form f = [[get your form]];
LabelChanger.SetLabelText(f, "lblWhatever", "New Label Text");

如果这些标签包含在其他容器(面板控件、GroupBox控件等)中,则您必须编写递归搜索-但是,这将是一个良好的开始。

为什么不直接在表单的控件集合中查找,也许使用控件ID作为标识符

public class LabelChanger
{
  public static void SetLabelText(Form form, string labelID, string labelText)
  {
    Label lbl = form.Controls["labelID"] as Label;
    if(lbl != null)
      lbl.Text = labelText;
  }
}
然后,给你一张表格,你可以这样做-

Form f = [[get your form]];
LabelChanger.SetLabelText(f, "lblWhatever", "New Label Text");

如果这些标签包含在其他容器(面板控件、GroupBox控件等)中,那么您将不得不编写一个递归搜索-然而,这将是一个好的开始。

这对我来说非常困难,这里的帖子也有帮助。我最后做的是:

public static ToolStripStatusLabel ts = new ToolStripStatusLabel();      
public Form1()
{
    InitializeComponent();
    ts = toolStripStatusLabel1;

然后,我在任何地方都这样做:

ts.Text = "Some Text.";
Application.DoEvents();

我发现,如果不添加DoEvents()语句,状态更新的频率就不够频繁。这将有助于排除故障

这对我来说非常困难,这里的帖子帮了我的忙。我最后做的是:

public static ToolStripStatusLabel ts = new ToolStripStatusLabel();      
public Form1()
{
    InitializeComponent();
    ts = toolStripStatusLabel1;

然后,我在任何地方都这样做:

ts.Text = "Some Text.";
Application.DoEvents();

我发现,如果不添加DoEvents()语句,状态更新的频率就不够频繁。这将有助于排除故障

注意到了,但我被卡住了。我创建了以下函数,但仍然无法访问它:公共工具StripStatusLabel StatusLabel(字符串newStatus){tlsStatusLabel.Text=newStatus;return tlsStatusLabel;}@mouthpiec-听起来你有一个“System.Windows.Forms.Form”的实例,但你需要转换到一个“MyForm”的实例,在这个实例中,你的标签被声明为属性。注意到了,但我被卡住了。我创建了以下函数,但仍然无法访问它:公共工具StripStatusLabel StatusLabel(字符串newStatus){tlsStatusLabel.Text=newStatus;return tlsStatusLabel;}@mouthpiec-听起来好像您有一个“System.Windows.Forms.Form”的实例,但您需要强制转换到“MyForm”的实例,在该实例中,标签被声明为属性。