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

  • 相关阅读:
    轻轻松松教你写日志-超级简单
    JAVA实现KNN分类
    怎样给filter加入自己定义接口
    设计模式之Visitor模式(笔记)
    Leet Code OJ 237. Delete Node in a Linked List [Difficulty: Easy]
    在C#中怎样推断线程当前所处的状态
    leetCode 83.Remove Duplicates from Sorted List(删除排序链表的反复) 解题思路和方法
    谈谈源码管理那点事儿(一)——源码管理十诫(转)
    安装gi的时候回退root.sh的运行
    Android开发学习之路--异步消息Handler,Message,Looper和AsyncTask之初体验
  • 原文地址:https://www.cnblogs.com/GIScore/p/5954405.html
Copyright © 2011-2022 走看看