我有一个Windows窗体应用程序 我的表单代码中有一个公共类,后面有以下结构:
public partial class Home : Form
{
public class AsynchronousSocketListener
{
public void ReadCallback(IAsyncResult ar)
{
//Here I want to Update a labels text this waw :
//label1.Text = currantRFID;
}
}
}
我无法在lablel1
函数中访问ReadCallback()
控件并更新它的文本。
当我尝试这样做时,我收到以下错误:
Error 3 Cannot access a non-static member of outer type 'SFTWindowApplications.Home' via nested type 'SFTWindowApplications.Home.AsynchronousSocketListener'
如何访问它以及更新It文本的最佳方法是什么?我的意思是更新它Asynchronously
是否更好?
答案 0 :(得分:3)
嵌套类(即AsynchronousSocketListener
)不能自动访问其外部类型的非静态成员(即Home
)。
重新启动IDE不会改变这一点。 IntelliSense正在做它应该做的事情 - 不列出不在范围内的外部类型的成员。
如果您希望异步侦听器影响表单的标签,AsynchronousSocketListener
的实例需要引用label1
...
// Really this is just an example of how it could avoid the error you encountered -
// reality checked only by my cerebral compiler. :)
public partial class Home : Form
{
// instance of the async socket listener to use
private AsynchronousSocketListener asyncSocketListener;
public Home()
{
// Initialize the async socket listener, and provide to it a reference to
// the label it should update.
asyncSocketListener = new AsynchronousSocketListener(label1);
}
public class AsynchronousSocketListener
{
private Label targetLabel;
public AsynchronousSocketListener(Label targetLabel)
{
this.targetLabel = targetLabel;
}
public void ReadCallback(IAsyncResult ar)
{
// // assuming currantRFID is part of the async result ar
this.targetLabel.Text = ar.currantRFID;
}
}
}
......,或者你需要采取事件驱动的方法。
理想情况下,类之间的关系以及响应之后发生的事情将不那么具体了。严格的(例如,不仅仅是一个标签,不要求班级彼此了解太多)。事件驱动的方法(即异步监听器通过更新其标签来引发此特定表单订阅和处理的事件)将实现这些目标。但我承认,我只是试图让您了解它对于您所问的问题中心的非静态成员访问是如何工作的。
答案 1 :(得分:3)
它是一个不同的类,因此您需要传递标签实例或将Home类实例传递给方法并将标签设为public(默认情况下它受保护)。
更新:使用BackGroundWorker的新代码 注意:我没有测试这段代码,但它应该给你一个想法。
public partial class Home : Form
{
public class AsynchronousSocketListener : IDisposable
{
private BackgroundWorker worker = new System.ComponentModel.BackgroundWorker();
private Label myLabel;
public AsynchronousSocketListener(Label lbl)
{
myLabel = lbl;
worker.RunWorkerCompleted += WorkerCompleted;
worker.DoWork += DoWork;
worker.RunWorkerAsync();
}
public void Dispose()
{
worker.RunWorkerCompleted -= WorkerCompleted;
worker.CancelAsync();
worker.Dispose();
}
private void DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
// Perform your work on the other Thread
e.Result = currantRFID;
}
public void WorkerCompleted(object sender, RunWorkerCompletedEventArgs args)
{
//Here I want to Update a labels text this waw :
myLabel.Text = args.Result;
}
}
}
/*
public partial class Home : Form
{
public class AsynchronousSocketListener
{
private Label myLabel;
public AsynchronousSocketListener(Label lbl)
{
myLabel = lbl;
}
public void ReadCallback(IAsyncResult ar)
{
//Here I want to Update a labels text this waw :
myLabel.Text = currantRFID;
}
}
}
*/
答案 2 :(得分:0)
尝试重新启动IDE,如果没有帮助,请显示设计器代码。
答案 3 :(得分:0)
如果没有对父类的引用,则无法访问其他类中的一个类的成员。您需要通过Home类访问label1
内的ReadCallback
。
请参阅this example
答案 4 :(得分:0)
您需要将Home-Class提供给要使用控件的类,例如:
[...]新的AsynchronousSocketListener(this)
并将其传递到您所需的深度。