這幾天一直在研究TX Text Control的使用,由於這方面的資料相對比較少,主要靠下載版本的案例代碼進行研究,以及官方的一些博客案例進行學習,使用總結了一些心得,特將其總結出來,供大家分享學習。本篇隨筆主要介紹TX Text Control V20的相關使用心得。
1、TX Text Control控件介紹
TX Text Control是一款功能類似於 MS Word 的文字處理控件,包括文檔創建、編輯、打印、郵件合並、格式轉換、拆分合並、導入導出、批量生成等功能。廣泛應用於企業文檔管理,網站內容發布,電子病歷中病案模板創建、病歷書寫、修改歷史、連續打印、病案歸檔等功能的實現。
這個控件主要的功能就是可以作為Word以及其他文檔的編輯器使用,雖然展示WORD內容的控件也有一些,如我們可以利用DevExpress里面的RTF文檔編輯器來實現,同樣運行的很好,結合Aspose.Word后台的文檔處理,我們可以做到類似報表的數據生成,而且可以把生成后的文檔進行顯示、編輯等操作處理。
TX Text Control雖然作為文檔編輯各方面都表現不錯,不過其MailMerge郵件合並功能還是經常使用的一個功能,就是把我們的數據和文檔模板來一個合並,然后顯示最終的文檔內容,這種可以用來做一些類似發票、郵件、員工信息等的數據處理和顯示,MailMerge郵件合並可以綁定主從表的數據,能夠符合大多數的要求。
我本來想用它做一個類似電子病歷一樣的功能模塊,不說在文檔里面,我們很難做到一些下拉列表的處理( 官方博客里面有一個簡單的案例,不過不好用),一般情況下,如果我們只是做文檔展示、數據合並等常規的操作,還是很不錯的。
這個控件的功能介紹,可以參考葡萄城里面的網頁介紹(http://www.gcpowertools.com.cn/products/textcontrol_winform_features.htm),這個控件的相關開發人員使用然后分享經驗的文章很少,能在網上搜到的大多數是葡萄城人員對這個控件的Demo代碼進行一個簡單粘貼說明,沒有進一步的深入介紹和應用場景的介紹。雖然葡萄城列舉了幾個電子病歷的公司產品案例,不過這幾家公司的電子病歷產品是很難下載到,也無從知道真假或者使用情況。
這幾天我把這個控件的各種特性做了一些學習,並重新把官網的文檔編輯例子進行了全新開發,參考着做了一個完全一樣的編輯器版本,也基本上對它的各個屬性、方法處理有了一個更加深入的了解。
我們先通過一個軟件界面來了解整個軟件的一些功能(這個是我仿照官方案例做的一個程序)。
這個控件默認安裝后,會帶有很多Demo案例,具體可以參考目錄C:\Users\Administrator\Documents\TX Text Control 20.0.NET for Windows Forms\Samples\ 進行了解。
2、TX Text Control控件的漢化
這個控件界面默認是英文版本的,控件的相關菜單以及提示都是英文,因此我們需要對資源做一些中文本地化處理才能正確顯示。
官方沒有提供中文漢化包,只提供一個標准的英文資源,如下所示。
我們需要做的就是將它們進行中文翻譯,然后重新編譯(使用buildres.bat腳本編譯)為中文資源dll。
我們先使用VS編輯工具,把這些英文資源記錄轉換為英文(這是一個比較繁瑣的工作,官方網站上有一些舊版本的中文包可供參考,以及最新的V20軟件(編輯器軟件)下載下來運行參考)。
我們逐一進行中文處理,可以使用百度、Google的翻譯,以及軟件界面的參考哦。
以管理員方式運行VS的命令行,然后執行命令進行編譯資源即可。
buildres.bat zh-CN
編譯成功后,在目錄里面,會增加兩個資源程序集。
txdocumentserver.resources.dll
txtextcontrol.resources.dll
然后我們把它復制到運行目錄下,並放在zh-CN的目錄里面即可。有了這些中文化的資源程序集,我們就可以利用它進行對控件的內置菜單提示進行中文化了。
中文化操作和其他常規的做法一樣,我們在Main函數里面,添加如下代碼即可。
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN"); Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("zh-CN");
運行程序,我們使用右鍵菜單,發現里面的資源都已經正常漢化了,其他相關的內置菜單和界面也都可以看到正常漢化。
3、TX Text Control的使用
有了漢化,只是我們正常使用控件的第一步,我們需要在程序里面整合控件,那么就需要對它進行使用,以及對控件的屬性、事件進行處理,才能得到最佳的應用效果。
我們在VS工具欄里面加入對應的控件,可以看到有以下相關的控件對象可供使用,一般情況下我們使用TextControl,然后在其基礎上創建其他RulerBar、ButtonBar、StatusBar即可,而如果我們需要合並數據(很常用)就需要加入MailMerge控件對象。
添加控件后,我們可以對控件的相關基礎的復制、粘貼、剪切等操作可以直接利用控件的API即可實現。
private void menuEdit_Undo_Click(object sender, EventArgs e) { _textControl.Undo(); } private void menuEdit_Redo_Click(object sender, EventArgs e) { _textControl.Redo(); } private void menuEdit_Cut_Click(object sender, EventArgs e) { _textControl.Cut(); }
其中查找、替換對話框也是可以通過API進行調出。
private void menuEdit_Find_Click(object sender, EventArgs e) { _textControl.Find(); } private void menuEdit_Replace_Click(object sender, EventArgs e) { _textControl.Replace(); }
利用這些最基礎的API是常規的操作。
而利用插入相關的對象,如圖片、文本框等,就需要做一些簡單的編碼,方便把對象加入到TextControl對象里面。
private void menuInsert_Image_Click(object sender, EventArgs e) { TXTextControl.Image imageNew = new TXTextControl.Image(); _textControl.Images.Add(imageNew, TXTextControl.HorizontalAlignment.Left, -1, TXTextControl.ImageInsertionMode.DisplaceText); } private void menuInsert_TextFrame_Click(object sender, EventArgs e) { try { // Force Exception if standard version: _textControl.TextFrames.GetItem(); Size sizeTextFrame = new Size(2268, 2268); // 4 x 4 cm TXTextControl.TextFrame textFrameNew = new TXTextControl.TextFrame(sizeTextFrame); _textControl.TextFrames.Add(textFrameNew, TXTextControl.HorizontalAlignment.Left, -1, TXTextControl.TextFrameInsertionMode.DisplaceCompleteLines); } catch (Exception ex) { MessageBox.Show(ex.Message, ProductName); } }
這個控件最常見的就是MailMerge進行合並數據的操作了,這個也是我們利用它來處理很多模板化文檔的目的。
MailMerge對象合並數據的操作,主要是接受集合對象或者是DataTable對象,所以我們必須將我們的數據轉換為這種格式,否則合並數據得不到要的結果。
合並數據的處理方式,最開始就是需要設計好模板,這點很重要,模板的設計還是沿用了常規Word文檔域對象的概念,需要添加一些域來做后續數據替換的對象占位符,如下是我測試的一個模板。
這個里面主要是主從表整合的一個模板,我們需要綁定常規的主表記錄,也需要綁定明細表的集合記錄,不過最后我們都需要把數據對象轉換為集合(如DataSet),然后才能綁定到文檔對象上去。
在上面的文檔里面,你知識看到了域對象,而沒有看到一個隱藏的一個集合記錄的開始和結束的書簽設置。關於書簽的作用和如何操作,可以了解我之前的隨筆文章《利用Aspose.Word控件實現Word文檔的操作》、《利用Aspose.Word控件和Aspose.Cell控件,實現Word文檔和Excel文檔的模板化導出》
書簽的作用很重要,否則無法正常解析集合的記錄並綁定在WORD界面上的,我們打開書簽管理對話框,可以看到上述文檔里面有兩個位置,書簽標記的開始和結束位置。
這樣我們設計好模板后,第二步就是通過代碼生成相關對象,然后和文檔進行合並就可以了。
例如我構建一個主表和一個從表的記錄,統一把它們生成一個DataSet對象供使用。
public static DataSet CreateDataSet() { DataSet ds = new DataSet(); DataTable dtMain = DataTableHelper.CreateTable("Company,HandNo,Creator,CreateTime|DateTime"); dtMain.TableName = "main"; DataRow dr = dtMain.NewRow(); dr["Company"] = "廣州愛奇迪軟件科技有限公司"; dr["HandNo"] = "123456"; dr["Creator"] = "伍華聰"; dr["CreateTime"] = DateTime.Now; dtMain.Rows.Add(dr); DataTable dt = DataTableHelper.CreateTable("ID,ProductName,Description,Price|decimal,Quantity|int"); dt.TableName = "ProductInfo"; dr = dt.NewRow(); dr["ID"] = "1"; dr["ProductName"] = "海飛絲洗發水"; dr["Description"] = "海飛絲洗發水, 550ml"; dr["Price"] = 19.8M; dr["Quantity"] = 100; dt.Rows.Add(dr); dr = dt.NewRow(); dr["ID"] = "2"; dr["ProductName"] = "聯想品牌電腦"; dr["Description"] = "聯想Y700-15ISK-ISE 旗艦版"; dr["Price"] = 6500M; dr["Quantity"] = 10; dt.Rows.Add(dr); dr = dt.NewRow(); dr["ID"] = "3"; dr["ProductName"] = "IPhone7 128G"; dr["Description"] = "蘋果IPhone7, 128G"; dr["Price"] = 5800M; dr["Quantity"] = 10; dt.Rows.Add(dr); ds.Tables.Add(dtMain); ds.Tables.Add(dt); return ds; }
先加載模板文檔
if (setting == null) { setting = new TXTextControl.LoadSettings(); setting.ApplicationFieldFormat = TXTextControl.ApplicationFieldFormat.MSWord; } _textControl.Load(Application.StartupPath + "\\Template\\template1.docx", TXTextControl.StreamType.WordprocessingML, setting);
整合合並數據
DataSet ds = PurchaseInfoHelper.CreateDataSet(); mailMerge1.MergeBlocks(ds); mailMerge1.Merge(ds.Tables["main"], true);
最后就可以看到我們所需要的結果了。
當然,如果很熟悉Aspose.Word控件的使用,我們其實也可以利用Aspose.Word控件來做后台的數據整合處理,Aspose.Word控件支持很多變量定義,以及更加復雜的處理,如我把原來在框架模塊里面的人員信息導出Word功能抽取出來,這個模塊原先是利用Aspose.Word來處理數據合並的,我不修改其中的邏輯,只是把合並后的數據展示在TX Text Control即可,如下代碼所示。
var saveFile = StaffHelper.GenerateDoc(); //加載文檔 _textControl.Load(saveFile, StreamType.MSWord);
最后就生成了我們開始介紹的軟件界面效果。
這個控件目前使用起來還算不錯,不過對於一些數據源的處理方面,以后希望繼續增加更多的接口,繼續保持觀察,希望能將研究的成果用在具體的項目上。