c#从另一个类更新标签
本文关键字:更新 标签 另一个 | 更新日期: 2023-09-27 18:15:08
我如何从另一个类更新标签,我已经看到了许多答案,但不是我的例子。下面是我的代码:
class 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();
}
}
}
这是完整的代码更清楚。我需要你的帮助
您需要将代码更改为以下内容
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");
}
你可以通过在Form_Load上设置一个方法来引用表单。
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全局变量后,就可以引用Form了。请记住,像标签或按钮这样的对象必须将其修饰符(在对象属性Form1[Design]中找到)更改为public,以便您可以更改文本,名称等