zoukankan      html  css  js  c++  java
  • C# 命令绑定

    在构建WinForm程序中,为了使系统的结构清晰,有好的用户交互体验,实现不同按钮之间的交互,不使主窗体里面的代码臃肿。将按钮的命令通过类进行绑定,实现命令的管理使很有必要的。

    该文章是将如何实现Button的按钮事件绑定的。

    1、新建WinForm程序

    2、添加3个Button按钮,如下图所示

    3、新建ICommand.cs接口,代码如下

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace commandTest
    {
        //命令接口
        public  interface ICommand
        {
            void OnClick();
            void New();
            void Refresh();
        }
    }

    4、新建命令管理类CommandUnitily.cs,代码如下

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace commandTest
    {
        class CommandUnitily
        {
            //创建命令集合
            private static List<ICommand> cmds = new List<ICommand>();
    
            //将命令添加到集合里面
            public static void  CmdRegist(ICommand cmd)
            {
                   cmds.Add(cmd);
            }
            //刷新所有命令,用于命令直接的相互影响
            public static void AllRefresh()
            {
                foreach (ICommand cmd in cmds)
                {
                    cmd.Refresh();
                }
            }
        }
    }

    5、新建Button按钮通用类ButtonTool.cs,代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace commandTest
    {
         //button控件公用类,继承自ICommand接口
         class ButtonTool : ICommand      
        {
            private Button bt;
    
            void bt_Click(object sender, EventArgs e)
            {
                OnClick();
                CommandUnitily.AllRefresh();//所有按钮都刷新,包括按钮本身
            }
            //使用virtual关键词之后,调用OnClick方法之后,
             //会调用派生类(举例:Button1Click)中的OnClick,
             //从而实现各自的button点击事件
            public virtual void OnClick()
            {
               Console.WriteLine("点击button事件");
            }
    
    
    
            public void New(Button but)
            {
                bt = but;
                bt.Click += new EventHandler(bt_Click);
            }
    
            public void Refresh()
            {
                Console.WriteLine(bt.Name+"刷新");
            }
    
    
            public void New()
            {
                throw new NotImplementedException();
            }
        }
    }

    6、创建Button1Click.cs点击类,代码如下

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace commandTest
    {
        //创建Button1事件执行类,继承自ButtonTool
        class Button1Click : ButtonTool
        {
            public Button1Click(Button obj)
            {
                Console.WriteLine("button1注册成功");
                this.New(obj);
            }
            //重写ButtonTool类的OnClick方法,用于实现Button1的点击事件
            public override void OnClick()
            {
                base.OnClick();
                Console.WriteLine("点击button1事件");
            }
        }   
        
    }

    7、主窗体Form.cs代码如下

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace commandTest
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                CommandUnitily.CmdRegist(new Button1Click(button1));
      Console.WriteLine("窗体加载完毕"); } } }

    8、文件结构如下:

    9、测试

    从窗体加载到点击button1测试的结果如下图:

    可以借鉴Button1Click.cs类实现button2和button3的按钮点击事件

    源代码:http://pan.baidu.com/s/1eSwoh5C

  • 相关阅读:
    luogu P1073 最优贸易 |分层图最短路
    luogu P1901 发射站 |单调队列
    luogu P1759 通天之潜水 |背包
    luogu P1801 【黑匣子_NOI导刊2010提高(06)】|堆+分块
    bzoj1642[Usaco2007 Nov]Milking Time 挤奶时间*
    bzoj1616[Usaco2008 Mar]Cow Travelling游荡的奶牛*
    bzoj1623[Usaco2008 Open]Cow Cars 奶牛飞车*
    bzoj1612[Usaco2008 Jan]Cow Contest奶牛的比赛*
    bzoj1639[Usaco2007 Mar]Monthly Expense 月度开支*
    bzoj1601[Usaco2008 Oct]灌水*
  • 原文地址:https://www.cnblogs.com/GIScore/p/5954405.html
Copyright © 2011-2022 走看看