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中輸入某些行中包含的數據,然后點擊查詢,就會就不包含這些數據的行刪除掉。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM