C#更新另一个类的标签

时间:2014-07-28 12:59:37

标签: c# label

如何从其他类更新标签,我已经看到很多答案,但不是我的例子的功能。 这是我的代码:

类Form1:看起来像这样:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace login
{
public partial class Form1 : Form
{

    public static Form1 Instance { get; private set; }


    public Form1()
    {
        InitializeComponent();
        Instance = this;
        MediaEvent device = new MediaEvent();

    }




    private void button2_Click(object sender, EventArgs e)
    {            
        MediaEvent msg = new MediaEvent();
        string u = textBox1.Text;
        string p = textBox2.Text;

        msg.checkLogin(u, p);
        label2.Text = msg.getMessage();

    }

    public void TextStatus(string aString)
    {
        // Place messages in Main Display list box window

        this.lstatus.Text = aString;
    }
    public void TextToBox(string aString)
    {
        // Place messages in Main Display list box window

        this.listBox1.Items.Insert(0, aString);
    }

    public void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {

    }
}
}

类MediaEvent如下所示:

using System;
using System.Collections.Generic;
using System.Text;
using System.Management;
using System.Windows.Forms;

namespace login
{
class MediaEvent: IDisposable
{
    public string MyMsg { get; set; }
    public string State { get; set; }
    public string getMessage()
        {
            return MyMsg;
        }
    public void checkLogin(string u, string p)
    {
        if((u != "user") && (p != "password"))
        {
            MyMsg +="Id or password no correct, please try again.";
        }
    }
    Form1 MainForm;



    private ManagementEventWatcher watcherAttach;
    private ManagementEventWatcher watcherRemove;

    public MediaEvent()
    {
        if (watcherAttach == null)
        {
            watcherAttach = new ManagementEventWatcher();          
            watcherAttach.Query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2");
            watcherAttach.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
            //Form1.Instance.TextStatus("On");
            watcherAttach.Start();
        }

        if (watcherRemove == null)
        {
            watcherRemove = new ManagementEventWatcher();            
            watcherRemove.Query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 3");
            watcherRemove.EventArrived += new EventArrivedEventHandler(watcher_EventRemoved);
            //Form1.Instance.TextStatus("Off");
            watcherRemove.Start();
        }
    }

    /// <summary>
    /// Used to dispose of the USB device watchers when the USBControl class is disposed of.
    /// </summary>
    public void Dispose()
    {
        if (watcherAttach != null)
        {
            watcherAttach.Stop();
            watcherAttach.Dispose();                
            watcherAttach = null;
        }

        if(watcherRemove != null)
        {
            watcherRemove.Stop();
            watcherRemove.Dispose();
            watcherRemove = null;                
        }

    }



    void watcher_EventArrived(object sender, EventArrivedEventArgs e)
    {
        Form1.Instance.TextStatus("On");
        //MessageBox.Show("On");
    }

    void watcher_EventRemoved(object sender, EventArrivedEventArgs e)
    {
        Form1.Instance.TextStatus("Off");
        //MessageBox.Show("off");
    }




    ~MediaEvent()
    {
        this.Dispose();
    }

}

}

这是更完整的代码。我需要你的帮助

2 个答案:

答案 0 :(得分:1)

您需要将代码更改为以下内容

public partial class Form1 : Form
    {
        private static Form1 _instance; 
        public Form1()
        {

            InitializeComponent();
            _instance = this; 
        }


        public string TextStatus
        {
            get { return StatusLabel.Text;  }
            set { StatusLabel.Text = value;  }

        }

        public static Form1 Instance { get { return  _instance;  }}



    }

void watcher_EventArrived(object sender, EventArrivedEventArgs e)
    {
        Form1.Instance.TextStatus ="On"; // nothing is changed in label
        //MessageBox.Show("On");
    }

答案 1 :(得分:0)

您可以通过在 Form_Load 上设置方法来引用 Form。

private void Form1_Load(object sender, EventArgs e)
{
    MyClass.SetUIComponents(this);
}

之后,您在类中创建一个全局变量并使用表单初始化您的变量。

public class MyClass{
  //Constructor
  public MyClass(){...}

  public void SetUIComponents(Form1 Form1)
  {
      // Get MainForm to reference public UI objects 
      this.Form = Form;
  }
}

在您初始化 Form1 全局变量后,您可以引用该表单。 请记住,标签或按钮等对象必须将其修饰符(在对象属性 Form1[Design] 中找到)更改为 public,以便您可以更改文本、名称等...