我正在尝试做一些我认为很容易但无法弄清楚如何在我的陈述函数中写入标签的事情。
public static void StartProcessing(object data)
{
lblError.Text = "Blah Blah"
}
我收到错误“非静态字段、方法或属性需要对象引用...”
所以我尝试创建一个新的标签实例并将其添加到一个新的控件实例(面板),但是没有显示 lblError
public static void StartProcessing(object data)
{
Panel Panel1 = new Panel();
Label lblError= new Label();
Panel1.Controls.Add(lblError);
lblError.Visible = true;
lblError.Text = "Blah Blah";
}
必须有一个简单的方法来做到这一点?我忽略了..
该函数被调用如下:如果我将上面的内容更改为非静态的,我会在下面的第二行收到一条错误消息,内容相同“非静态字段、方法或属性需要对象引用...”当这个函数不是静态的?
public object LaunchNewProcess(object data)
{
ThreadPool.QueueUserWorkItem(
new WaitCallback(ProcessStatuses.StartProcessing),
new object[] {newProcess, allProcesses}
);
最佳答案
调用时将标签传递给静态函数:
public static void StartProcessing(object data, Label lblError)
{
lblError.Text = "Blah Blah"
}
静态函数无法访问控件,因为控件属于页面(类)的实例。
静态 表示一个类的所有实例共享相同的函数或变量。因此,类的实例可以访问静态变量或函数。但是,由于静态不“知道”类的任何实例,因此它无法访问实例的成员。事实上,静态方法或变量甚至不需要类的任何实例存在,那怎么可能呢?
从您的函数中删除 static
关键字也可以,正如其他人提到的那样,但我假设您出于某种原因将其设为静态。
编辑 好吧,这更复杂。
那么,您有一些启动一堆线程的类,并且您希望它在出现问题时向用户显示?那么,您当前的方法是有缺陷的,因为如果没有页面实例,您将无法访问页面的控件。此外,我不确定这种方法如何适合页面生命周期。
您最好的方法(抱歉缺少代码,这在很大程度上取决于您的实现)可能是这样的:
//do this before you start spawning threads
List<bool> successes = new List<bool>();
ThreadPool.QueueUserWorkItem(
new WaitCallback(ProcessStatuses.StartProcessing),
new object[] {newProcess, allProcesses, successes}
);
//you MUST wait for all your threads to complete before proceeding!
if(successes.Any(s => !s))
{
//update your error label
}
public static void StartProcessing(object data, Label lblError)
{
var dataArray = (object[3]) data;
//if there is an error
dataArray[2] = false;
}
关于c# - 从静态函数写入标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10323016/