這幾天一直在研究TX Text Control的使用,由於這方面的資料相對比較少,主要靠下載版本的案例代碼進行研究,以及官方的一些博客案例進行學習,使用總結了一些心得,特將其總結出來,供大家分享學習。本篇隨筆主要介紹TX Text Control V20的相關使用心得。 ...
這幾天一直在研究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);
最後就生成了我們開始介紹的軟體界面效果。
這個控制項目前使用起來還算不錯,不過對於一些數據源的處理方面,以後希望繼續增加更多的介面,繼續保持觀察,希望能將研究的成果用在具體的項目上。