【问题标题】:How to change a label from another class? c# windows forms visual studio如何更改另一个类的标签?时间:2019-05-10 标签:c#windowsformsvisual studio
【发布时间】:2012-05-27 01:01:04
【问题描述】:

我知道有很多线程在谈论这个,相信我我已经看到了所有这些,但我觉得我有点慢,无法弄清楚如何做到这一点,所以这就是问题所在! 我有一个表格

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

    }

    private void button4_Click(object sender, EventArgs e)
    {
        adi mYadi= new adi();
        adi.paso(); 
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    public void l8u(string l )
    {
       label8.Text = l; 
    }
}

l8u 方法应该更改label8 中的文本,所以它不能是静态的,因为label8 不是静态的(是公共的),我还有这个其他类

public class adi :instrucion
{
    private  int paso;
    private  int registroD;
    private  int registroO; 
    private  int valor;
    private  int vsin; 

    public adi()
    {
        paso = 1;
    }

    public  void setRD(int i){
        registroD = i; 
    }

    public  void setR0(int i)
    {
        registroO = i;
    }
    public void setV(int i)
    {
        valor = i;
    }

    public  int getRD()
    {
        return registroD ;
    }

    public  int getR0()
    {
        return registroO;
    }

    public int getVf()
    {
        return vsin;
    }

    public void paso(){
         //in this method I need change the value of label8
    }  
}

方法paso 是负责更改label8 值的方法,但我就是做不到!我尝试了许多不同的方法,例如做类似的事情

public void paso()
{
    Form1.l8u();
} 

但这是不可能的,因为 Form1 只是类的名称,而 l8u 不是静态方法,还尝试将 label8 设置为公共静态但 Visual Studio 不喜欢这样,每当我使用新控件时以VS的形式将公共静态更改为仅公共。

希望你能帮助我!

【问题讨论】:

  • 您需要将 Form1 的一个实例传递给您的 adi 类的实例。获得更好的接受率也不会对您造成伤害。
  • 我不知道接受百分比是做什么的.....
  • 接受您之前一些问题的一些答案:stackoverflow.com/faq#howtoask
  • 您应该考虑在以后的问题中将您的代码翻译成英文。

标签: c# forms class methods label


【解决方案1】:

以这种方式更改标签不是一个好主意,并且违反了一些编程范式。通常,底层业务逻辑类不应该直接操作 UI。

表单包含一个 adi 的实例。因此,如果没有将表单的实例(即this)传递给adi 构造函数(或传递给paso 方法),您就有点沉没了。

当需要Form1 更改其显示时,最好使用adi 可以触发的某种事件。

http://msdn.microsoft.com/en-us/library/aa645739(v=vs.71).aspx

【讨论】:

    【解决方案2】:

    我知道这是 2 年前的事了,但你不能这样做

    public static void function(label l)
      {
        l.Text = "Changed text"
      }
    

    然后在表单中做

    private void timer_tick(object sender, EventArgs e)
    {
        function(label);
    }
    

    【讨论】:

      【解决方案3】:

      我也在寻找答案,但我终于找到了如何从另一个类中更改 form1 的标签。

      通常 Form1.Designer.cs 是这样的:

                  this.label6.AutoSize = true;
              this.label6.Location = new System.Drawing.Point(59, 174);
              this.label6.Name = "label6";
              this.label6.Size = new System.Drawing.Size(72, 13);
              this.label6.TabIndex = 16;
              this.label6.Text = "Output String:";
      

      Form1.Designer.cs 应该如下所示,以便您可以在另一个类上调用它:

              label8 = new System.Windows.Forms.Label();
      
                  label8.AutoSize = true;
              label8.Location = new System.Drawing.Point(219, 26);
              label8.Name = "label8";
              label8.Size = new System.Drawing.Size(35, 13);
              label8.TabIndex = 25;
              label8.Text = "label8";  
      
               // 
              // Form1
              // 
              this.Controls.Add(label8);
      

      一些“这个”。 Form1.Designer.cs 中 label8 中“this.Controls.Add”部分除外的文本

      你应该像这样从另一个类中调用它:

      WindowsFormsApplication999.Form1.label8.Text = "your text here."; //This should modify label8.Text.
      

      编辑:

      您还应该在 Form1.Designer.cs 中修改它

              private System.Windows.Forms.Label label8;
      

      进入这个:

              public static System.Windows.Forms.Label label8;
      

      【讨论】:

        【解决方案4】:

        只需将标签的修饰符属性更改为 internal 或 public,然后调用您的表单并直接更改标签文本..

        Form2 frm = new Form2(); // Form 2 contains label8 and calling in a method (i.e.buttonclick) of form1
        
        if (List<WhoLovesMe>.Count > 0)
        {
           frm.Label8.Text = "Someone Loves Me :)";
        }
        else
        {
           frm.Label8.Text = "Noone Loves Me :(";
        }
        

        【讨论】:

        • 但是它创建了一个新表单并在这个新表单中更改了 Label8 的值,对吗?因为我之前尝试过(创建一个新的 form1 实例并更改 label8 的值)但它没有做任何事情
        • 没有。当您以单独的形式调用时,如果您将其属性设置为内部/受保护的内部或公共,则您调用的表单仅被初始化(准备使用它)。但是如果它的修饰符设置为私有,那么是的,从头开始初始化一个新表单。 .如果您的表单(您想要更改它是控件的一些属性)已经显示在屏幕上,您需要使其无效才能看到更改..所有基于事件的设置都使用此方法..调用表单的新实例并设置属性并显示/验证
        • 好吧,这种方式对我不起作用 :( 但我刚刚发现我刚刚找到了一个可以解决问题的小代码:Label lb = (Label) Application.OpenForms["Form1"].Controls.Find("label8", false).FirstOrDefault(); lb.Text = "Form2";) 你对此有何看法?这很好吗?想法用这个?
        • 是的..这对于已经显示的表单很有用..但是如果您需要考虑即使是很小的性能提升,那么您可以像这样过滤它:Application.OpenForms["Form2"].Controls .OfType
        • 仅仅因为语言允许你做某事,并不意味着这是一个很好的解决方案。这是一种非常做他想做的事的黑客方式。
        猜你喜欢
        • 2020-03-22
        • 2020-06-15
        • 2020-10-01
        • 2015-06-14
        • 2011-07-08
        • 2012-02-03
        • 2017-04-15
        • 2021-07-31
        • 2016-01-27
        相关资源
        最近更新 更多