首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2013-02-25 
请教个菜鸟问题 在类中更新窗体上的控件可以做把form的对象传给类不过想用委托实现整半天正不明白了最好能

请教个菜鸟问题 在类中更新窗体上的控件
可以做把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楼的看看

是在窗体上触发啊。

热点排行