辜渝傧

13037102709

027-87870986

教学实训

您当前的位置:首页 > 教学资源 > 实训方案 >

C#应用实训|任务3 事件引发页面刷新

发布者:唯众    布时间:2020-12-21 11:52:38    点击量:

任务描述

        C#作为面向对象的程序设计,任何事物都是对象,UI界面中的控件都作为一个单独的对象存在,对象与对象之间通过发送消息进行通信,接受消息的对象可以根据信息引发不同的动作,在C#中通过事件机制发送消息,通过事件机制可以保证UI控件的更新必须在满足一条件下执行,只有订阅了特定事件的控件在该事件发生后才引发事件代码的执行,如果事件没有发生或控件没有订阅事件,则不执行刷新代码,这样极大地提高了程序的执行效率。比如任务中的温度监测控制只有在温度传感器在线时再执行页面刷新动作,光照监测控制只有在光照传感器工作时再执行页面刷新动作,避免了资源浪费。

知识引入

  1. 事件
        C#中的事件通过委托来实现,事件允许一个对象向另一个对象通知消息,发送消息的对象称为事件源,被通知的对象要求事先订阅事件,只有订阅了事件的对象才能收到消息,C#中的事件处理步骤如下:
  • 定义事件
  • 订阅事件
  • 事件发生时通知订阅者
事件的定义:
[访问修饰符]  event  委托名  事件名;
因此,事件在定义前首先要定义委托,然后再根据委托定义事件,例:
public  delegate  void  setUiHandler();
public  event  setUiHandler  eventsetUiHandler ;
订阅事件:
订阅事件使用运算符“+=”,一个事件可以被多个对象订阅,订阅者可能通过“-=”取消已订阅的事件,例:
eventsetUiHandler +=new  setUiHandler (toolWd.getWd);
eventsetUiHandler +=new  setUiHandler (toolPhoto.getPhoto);
引发事件:
if(eventsetUiHandler!=null)
{
eventsetUiHandler();
}
当没有对象订阅eventsetUiHandler时,则eventsetUiHandler的值为null,否则订阅者将激发事件并执行事件代码。
5-8
    public delegate void LaunchHandler();//定义委托
    public class Launch{
    public event LaunchHandler EventLaunchHandler;//定义事件
    public void BeginLanuch()
    {
        Console.WriteLine("卫星发射倒计时30分钟,各组进入准备");
        if(EventLaunchHandler!=null)
        {
            EventLaunchHandler();
        }
    }
    }
   public class PrepareCommand
   {
       string pid;
       public PrepareCommand()
       { }
       public PrepareCommand(string pid)
       {
           this.pid = pid;
       }
       public void command()
       {
           Console.WriteLine("指挥组"+pid+"进入30分钟准备状态,正常");
       }
   }
   public class PrepareControl
   {
       string pid;
       public PrepareControl()
       { }
       public PrepareControl(string pid)
       {
           this.pid = pid;
       }
       public void control()
       {
           Console.WriteLine("控制组" + pid + "进入30分钟准备状态,正常");
       }
   }
   public class PrepareRta
   {
       string pid;
       public PrepareRta()
       { }
       public PrepareRta(string pid)
       {
           this.pid = pid;
       }
       public void rta()
       {
           Console.WriteLine("监控组" + pid + "进入30分钟准备状态,正常");
       }
   }
    class Program
    {
        static void Main(string[] args)
        {
            Launch launch = new Launch();
            PrepareCommand p1 = new PrepareCommand("A001");
            PrepareControl p2 = new PrepareControl("B001");
            PrepareRta p3 = new PrepareRta("C001");
//订阅事件
            launch.EventLaunchHandler += new LaunchHandler(p1.command);
            launch.EventLaunchHandler += new LaunchHandler(p2.control);
            launch.EventLaunchHandler += new LaunchHandler(p3.rta);
            launch.BeginLanuch();
 
        } 
    }
程序运行如图5-9所示:
图5-9  程序运行效果图
  1. 参数事件
EventArgs类用作表示事件数据的所有类的基类。 例如,System.AssemblyLoadEventArgs类派生自EventArgs和用来保存程序集加载事件的数据。 若要创建一个自定义事件数据类,创建派生的类EventArgs类,并提供用于存储所需的数据的属性。 自定义事件数据类的名称应以结尾EventArgs。
5-9
public delegate void EventMenuHandler(object source, EventArgsTest e);
   public class EventArgsTest : EventArgs
    {
        public int menu { get; set; }
        public EventArgsTest(int menu)
        {
            this.menu = menu;
        }
    }
    class Menu
    {
        public event EventMenuHandler EventMenu;
        private int menu;
        public int MenuSelect
        {
            get { return menu; }
            set
            {
                if (EventMenu != null)
                {
                    EventArgsTest args = new EventArgsTest(value);
                    EventMenu(this, args);
                    this.menu = args.menu;
                }
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Menu menu1 = new Menu();
            menu1.EventMenu += new EventMenuHandler(menuTest);
            menu1.MenuSelect = 1;
            menu1.MenuSelect = 4;
        }
        public static void menuTest(object source, EventArgsTest e)
        {
            if(e.menu==4)
            {
                Console.WriteLine("系统退出:---"+DateTime.Now);
                Environment.Exit(0);
            }
            else{
                Console.WriteLine("欢迎进入系统,您选择的菜单为:"+e.menu);
            }
        }
    }

任务实现

新建Windows窗体应用程序项目,修改任务1后台代码如下:
  public partial class Form1 : Form
    {
        public delegate void UpdateUI();
        public event UpdateUI EventUpdate;
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            EventUpdate += new UpdateUI(setVal);
            if (EventUpdate!=null)
            {
            Thread t = new Thread(new ThreadStart(EventUpdate));
            t.IsBackground = true;
            t.Start();
            }
        }
        //随机生成温度
        private int getWd()
        {
            int result = -1;
            Random rand = new Random();
            result = rand.Next(20, 35);
            return result;
        }
        //随机生成光敏
        private int getPhoto()
        {
            int result = -1;
            Random rand = new Random();
            result = rand.Next(50, 150);
            return result;
        }
        //控件刷新
        private void setVal()
        {
                while (true)
                {
                    if (InvokeRequired)
                    {
                        int wdNum = getWd();
                        int photoNum = getPhoto();
                                               //泛型委托Action
                        this.Invoke(new Action(delegate()
                        {
                            lblTemp.Text = wdNum.ToString();
                            if (wdNum >= 28)
                            {
                                lblFs.Text = "打开";
                            }
                            else
                            {
                                lblFs.Text = "关闭";
                            }
                            lblPhoto.Text = photoNum.ToString();
                            if (photoNum >= 100)
                            {
                                lblRgb.Text = "打开";
                            }
                            else
                            {
                                lblRgb.Text = "关闭";
                            }
                        }));
                        Thread.Sleep(3000);
                    }
                }
            }
        }

任务小结

  1. 定义事件前首先要定义委托。
  2. 订阅者订阅事件后引发事件处理程序的执行。


上一篇:C#应用实训|任务2 委托实现页面刷新

下一篇:C#应用实训|项目五 知识拓展