网站首页 > 技术文章 正文
初学者写程序一般就是拖控件,双击,然后写上执行的代码,这样在窗口中就有很多事件代码,如果要实现各按钮的状态,那得在很多地方修改代码,极为复杂.通过参考CSHARPDEVELOP的代码就说明和网上各位朋友的示例,在这里,自己实现了一个很简单的插件程序,方便程序的开发,每个功能可以独立开发,也方便维护.再也不用到处判断各种状态,现在给大家讲讲其方法.先上两张以此方法开发的框架图片:
本系列教程,将会一步一步从0开发属于自己的框架,需要的朋友可以关注我。私发信息“框架4”会发送今天的示例源码,当连载完成后,会给大家发送上面的框架源码。源码可以基于VS2010的,一般2010以上的版本都可以打开。
不熟悉的朋友请查看我前面关于本插件技术的介绍,再来看今天的内容,当然直接看今天的代码也是可以的。今天我们接着来介绍一步一步实现自己的插件框架。 有朋友反应,运行时出现:“
ExampleAddin.WorkBenchSingleTon”的类型初始值设定项引发异常错误,这是由于在执行插件的加载过程中出现了错误,比如我们这本篇的例子中,判断查询按钮是否有效时的判断:有这样的语句:var form = 
WorkBenchSingleTon.WorkBench.ActiveMdiChild;由于最初执行时workbench可能为空,所以就会报错,例子中加了if (
WorkBenchSingleTon.WorkBench==null) return false;来避免,最好是在workbenchsingleton中集中处理这个问题。
前面已经实现了插件的基本功能,可能部分朋友不太清楚如何来使用,比如在View里面我们只使用了一个TextBox控件,而我们的界面中一般都会有很多的控件,如何加上去,而在IViewcontent中,我们只设置了一个ViewControl,答案就是使用自定义控件。现在我们 就来做一下。
首先添加一个用户自定义控件:userControl,可以在这个控件所继承的父类上一直使用查看定义,可以发现他的父类也是继承于Control这个类,所以我们的IViewContent的ViewControl是可以指 像这个自定义控件的。然后添加你自己希望在界面上所展示的控件,在这里添加了一个TextBox和一个 DataGridView,我们用来查找DataGridView中的数据。为了演示,我将查询按钮单独做成了一个插件(当然你可以直接在界面上增加一个按钮来查询,会更方便,但有时我们希望在其他地方增加这样的功能,所以做成了插件)。
然后在里面添加代码,我这里是往DataGridView中添加了一些数据:
 DataTable dt = new DataTable("dt");
        DataColumn c1 = new DataColumn("Name");
        DataColumn c2 = new DataColumn("Age");
        DataColumn c3 = new DataColumn("Address");
        
        public userControl()
        {
            InitializeComponent();
            dt.Columns.Add(c1);
            dt.Columns.Add(c2);
            dt.Columns.Add(c3);
            System.Random rd = new Random();
            for (int i = 0; i < 10; i++)
            {
                var r = dt.NewRow();
                r[0] = "张三" + rd.Next();
                r[1] = i + 10;
                r[2] = System.Guid.NewGuid();
                dt.Rows.Add(r);
                 
            }
            this.dataGridView1.DataSource = dt;
        }
    }
    public class User
    {
        public string Name { get; set; }
        public string Age { get; set; }
        public string Address { get; set; }
        public User(string name,string age,string add)
        {
            this.Name = name;
            this.Address = add;
            this.Age = age;
        }
        public User() { }
    }注意:在设计这个界面的时候一定要将这两个控件的可访问性改为public 以方便在其他的插件中来访问。
然后修改上次的其他一个按钮的功能:
public class test:AbstractCommand
    {
        public override void Run()
        {
            var form = WorkBenchSingleTon.WorkBench.ActiveMdiChild;
            if (form is IViewContent)
            {
                Search((IViewContent)form);                
            }
        }
        void Search(IViewContent view)
        {
           var control =  ((td.addin.userControl)((IViewContent)view).ViewControl);
           string name = control.tbName.Text;
           var dt = (DataTable)control.dataGridView1.DataSource;
           string e = "Name  not like '%" + name + "%'";
           var rows =dt.Select(e);
           foreach (var r in rows)
           {
               dt.Rows.Remove(r);
           }
          control.dataGridView1.DataSource = dt;
          
        }
        public override bool IsEnable
        {
            get
            {
                if (WorkBenchSingleTon.WorkBench==null) return false;
                var form = WorkBenchSingleTon.WorkBench.ActiveMdiChild;
                if (form is IViewContent)
                {
                    var control = ((td.addin.userControl)((IViewContent)form).ViewControl);
                    return control.dataGridView1.Rows.Count > 1;
                }
                return false;
            }
            set
            {
                base.IsEnable = value;
            }
        }
        public override string Caption
        {
            get
            {
                return "查询";
            }
            set
            {
                base.Caption = value;
            }
        }将其标题改为查询,同时他的IsEnable属性改为判断是否有子窗口,和子窗口中的DataGridView是否包含有数据行。否则就不能查询。如果是在实际使用中,这个地方可能会添加权限的判断功能。这样就很方便了。
我们在TextBox中输入某些行中包含的数据,然后点击查询,就会把不包含这些数据的行过滤掉。
我们通过这样的方式,就可以将工具栏上的按钮和界面中的内容进行分离开,避免到处都要判断按钮的状态等等。如果按钮和功能一多,根本就没有办法进行控制。
(如果C盘下由于权限问题不能创建文件,可以修改代码改为其它的条件判断即可)。
- 上一篇: 分享一款漂亮的 C# .Net 图形验证码
- 下一篇: c#,无处不在的委托(c#委托实例)
猜你喜欢
- 2025-07-28 5分钟掌握 c# 网络通讯架构及代码示例
- 2025-07-28 C#自学——基础语法(看看就行)(c#怎么自学)
- 2025-07-28 C# 实现固定长度的队列Queue(c#队列事件)
- 2025-07-28 c# 100秒倒计时功能的C#代码示例(基于Windows Forms):
- 2025-07-28 c#夯实基础-委托之Action(c# action 委托)
- 2025-07-28 5分钟掌握c#文件打印流程 及代码示例
- 2025-07-28 C#程序设计_窗体(c#窗体是什么)
- 2025-07-28 其他类(番外) C#(其他类型的文件怎么打开)
- 2025-07-28 C#.NET 并发令牌 详解(c# 并发 parallel)
- 2025-07-28 c#,委托与事件,发布订阅模型,观察者模式
- 最近发表
- 
- 聊一下 gRPC 的 C++ 异步编程_grpc 异步流模式
- [原创首发]安全日志管理中心实战(3)——开源NIDS之suricata部署
- 超详细手把手搭建在ubuntu系统的FFmpeg环境
- Nginx运维之路(Docker多段构建新版本并增加第三方模
- 92.1K小星星,一款开源免费的远程桌面,让你告别付费远程控制!
- Go 人脸识别教程_piwigo人脸识别
- 安卓手机安装Termux——搭建移动服务器
- ubuntu 安装开发环境(c/c++ 15)_ubuntu安装c++编译器
- Rust开发环境搭建指南:从安装到镜像配置的零坑实践
- Windows系统安装VirtualBox构造本地Linux开发环境
 
- 标签列表
- 
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (77)
- vector线程安全吗 (73)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)
 
