前面有朋友反應,運行時出現:“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