• 通过委托来设计一组投票器


    这是传智播客以前的一个案例,还是挺经典的

    委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

    定义了委托之后,通过委托来传递参数,这一点在传递一些特殊的状态时可以用到,比如说我有好几种状态,我可以通过委托来触发

    1.窗体设计

    2.代码部分

     委托具体实现过程先声明,再实例化

    using DelegateApp;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Reflection;
    
    using System.Windows.Forms;
    
    
    //喜科堂.Net开发技术学习网站:xiketang.ke.qq.com
    namespace DelegateApp
    {
        public partial class FrmShowRestult : Form
        {
            #region 基于OOP方式进行程序设计
    
            //1.声明委托
            public delegate void StartVoteDelegate(int num);
    
            //创建集合保存嘉宾对象
            private Dictionary<int, Guest> dicGuest = null;
    
            private List<Form> frmList = new List<Form>();
            public FrmShowRestult()
            {
                InitializeComponent();
                this.dicGuest = new Dictionary<int, Guest>()
                {
                    [1] = new Guest { Number = 1, Name = "李**" },
                    [2] = new Guest { Number = 2, Name = "王**" },
                    [3] = new Guest { Number = 3, Name = "赵**" }
                };
            }
    
            //2.根据委托原型编写对应的方法
            private void Receiver(int num)
            {
                //根据序号找到嘉宾对象,并使投票总数加1
                this.dicGuest[num].VoteCounter++;
                //同步显示投票结果(后面还可以继续封装)
                this.lblCounter1.Text = this.dicGuest[1].VoteCounter.ToString();
                this.lblCounter2.Text = this.dicGuest[2].VoteCounter.ToString();
                this.lblCounter3.Text = this.dicGuest[3].VoteCounter.ToString();
    
            }
    
            #endregion
    
            private void btnStartVote_Click(object sender, EventArgs e)
            {
                int counter = Convert.ToInt32(this.txtCounter.Text.Trim());
    
                for (int i = 0; i < counter; i++)
                {
                    //通过反射创建窗体(根据一个类的命名空间+类名的方式创建对象)
                    FrmVote frmVote = (FrmVote)Assembly.Load("DelegateApp").CreateInstance("DelegateApp.FrmVote");
                    frmVote.Text = "投票器:" + (i + 1).ToString();
    
                    //4.将投票长提中的委托变量,和当前窗体中的方法进行关联
                    frmVote.voteDelegate = this.Receiver;
                    frmVote.Show();
                    this.frmList.Add(frmVote);
                }
            }
    
            private void btnEndVote_Click(object sender, EventArgs e)
            {
                foreach (Form item in this.frmList)
                {
                    item.Close();
                }
            }
        }
    
    
    }
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using static DelegateApp.FrmShowRestult;
    
    namespace DelegateApp
    {
        public partial class FrmVote : Form
        {
    
            //3.创建委托遍历(将来通过外部赋值)
            public StartVoteDelegate voteDelegate = null;
            public FrmVote()
            {
                InitializeComponent();
                //将三个按钮的事件关联
                this.btnVote1.Click += new EventHandler(this.btnVote_Click);
                this.btnVote2.Click += new EventHandler(this.btnVote_Click);
                this.btnVote3.Click += new EventHandler(this.btnVote_Click);
            }    
    
            //开始投票
            private void btnVote_Click(object sender, EventArgs e)
            {
                Button btn = (Button)sender;
                //5.通过委托变量传递数据
                voteDelegate(Convert.ToInt32(btn.Tag));
    
                foreach (Control item in this.Controls)
                {
                    if (item is Button)
                    {
                        item.Enabled = false;
                        this.Text = "投票完成";
                    }
                }
            
            }
        }
    }
  • 相关阅读:
    杰我教育-新老学员交流会
    来杰我学IT,好就业
    怎么创建maven项目
    项目开发生命周期
    2015年12月28日,我工作了
    SSH架构图及各部分知识点
    jsp基础大全
    网站创建过程(二)
    网站创建过程(一)
    python+Django+mysql环境搭建
  • 原文地址:https://www.cnblogs.com/yinxuejunfeng/p/9753251.html
Copyright © 2020-2023  润新知