好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#一步一步实现插件框架的示例(四)

C#一步一步实现插件框架的示例(四)

C#一步一步实现插件框架的示例(四)

C#一步一步实现插件框架的示例(三)

C#一步一步实现插件框架的示例(二)

C#一步一步实现插件框架的示例(一)

前面有朋友反应,运行时出现:“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中输入某些行中包含的数据,然后点击查询,就会就不包含这些数据的行删除掉。

 最后附上源码: https://files.cnblogs.com/city-hunter/ExampleAddin4.rar

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于C#一步一步实现插件框架的示例(四)的详细内容...

  阅读:40次