读书人

请问个初学者有关问题 在类中更新窗体

发布时间: 2013-02-25 10:23:36 作者: rapoo

请教个菜鸟问题 在类中更新窗体上的控件
可以做把form的对象传给类 不过想用委托实现 整半天正不明白了 最好能给个简单的小例子 多谢
[解决办法]


class A
{
public event EventHandler viewProcess;

private void RaiseviewProcess(object sender, EventArgs e)
{
if (viewProcess != null)
{
viewProcess(sender, e);
}
}
private void aaaa()
{
RaiseviewProcess(this,new EventArgs());
}
}
class Form1
{
public Form1()
{
....
A a1= new A();
a1.viewProcess += (o,e) = > { 更新控件代码 };
}
}

[解决办法]
Thread thread1, thread2;
Object obj = new object();
List<ManualResetEvent> mres = new List<ManualResetEvent>();
Task task = new Task();

private void button1_Click(object sender, EventArgs e)
{
richTextBox1.Text = "";
Test();
}
public void Test()
{
task.OnMessageNotice += invokeMsg;
ManualResetEvent mre1 = new ManualResetEvent(false);
mres.Add(mre1);
ManualResetEvent mre2 = new ManualResetEvent(false);
mres.Add(mre2);
thread1 = new Thread(new ParameterizedThreadStart(task.DoWork));
thread2 = new Thread(new ParameterizedThreadStart(task.DoWork));



DataCls data1 = new DataCls(1, mre1);
DataCls data2 = new DataCls(2, mre2);
thread1.Start(data1);
thread2.Start(data2);
WaitHandle.WaitAll(mres.ToArray());
lock (obj)
{
richTextBox1.AppendText("任务已完成");
}

}
public delegate void SetTextHanlder(string msg);
private void invokeMsg(String obj){

if (richTextBox1.InvokeRequired)
{
richTextBox1.BeginInvoke(new SetTextHanlder(SetText), new object[] { obj });
}
}
private void SetText(string msg)
{
lock (obj)
{
richTextBox1.AppendText("\r\n" + msg);
}
//}
}

private void DoWork(object obj)
{
Invoke(new SetTextHanlder(SetText), new object[] { obj });
}
}

//消通知委托
public delegate void MessageNotice(string msg);
//任务类
public class Task
{
public event MessageNotice OnMessageNotice;
public void DoWork(object state)
{
DataCls data = state as DataCls;
MessageNoticeHandler(string.Format("每{0}个任务正在执行......", data.count));
//执行任务 具体任务就不写了用sleep代表任务要用很长时间。
Thread.Sleep(3000);
MessageNoticeHandler(string.Format("每{0}个任务执行完成", data.count));



data.m_mre.Set();
}

protected void MessageNoticeHandler(string msg)
{
if (OnMessageNotice != null)
{
OnMessageNotice(msg);
}
}

}

public class DataCls
{
public ManualResetEvent m_mre;
public int count;
public DataCls(int i,ManualResetEvent mre)
{
count = i;
m_mre = mre;
}
}
[解决办法]
class MyClass
{
Action<string> UpdateLabel;
public MyClass(Action<string> updatelabel)
{ UpdateLabel = updatelabel; }
public void Func()
{
if (UpdateLabel != null) UpdateLabel("hello");
}
}
窗体调用:
MyClass mc = new MyClass((x) => { label1.Text = x; });
mc.Func();
[解决办法]

引用:
感谢2楼4楼的高手 代码都可用 不过是需要在窗体上触发才行 我需要一个在类里处理玩消息就自动更新控件的 我菜鸟 再去研究3楼的看看

是在窗体上触发啊。

读书人网 >C#

热点推荐