轉(zhuǎn)帖|其它|編輯:郝浩|2012-02-13 01:43:37.000|閱讀 389 次
概述:郵件合并功能與之前的提到的將TX文檔全部存入數(shù)據(jù)庫有所不同,郵件合并功能是將數(shù)據(jù)庫中特定字段插入到模板文檔的特定位置。與此同時(shí),本章節(jié)還會(huì)演示在郵件合并功能的基礎(chǔ)上添加打印功能、以及如何創(chuàng)建郵件合并所需的模板文檔。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
郵件合并功能與之前的提到的將TX文檔全部存入數(shù)據(jù)庫有所不同,郵件合并功能是將數(shù)據(jù)庫中特定字段插入到模板文檔的特定位置。與此同時(shí),本章節(jié)還會(huì)演示在郵件合并功能的基礎(chǔ)上添加打印功能、以及如何創(chuàng)建郵件合并所需的模板文檔。
本章節(jié)相應(yīng)的源代碼可以在TX Text Control.NET的安裝目錄中找到:
Samples\WinForms\VB.NET\MailMerge
Samples\WinForms\CSharp\MailMerge
第一步:合并數(shù)據(jù)庫數(shù)據(jù)和文本
啟動(dòng)程序并選擇Template菜單下的Load命令,通過Load命令加載模板文件,模板文件中包含一些文本域,這些文本域的數(shù)據(jù)將被數(shù)據(jù)庫中對應(yīng)的數(shù)據(jù)替換。
選擇Database菜單下的Browse Database命令打開【Address Database】窗體,通過該窗體可以從數(shù)據(jù)庫中選擇數(shù)據(jù)并合并到文檔中。
當(dāng)點(diǎn)擊Merge按鈕時(shí),數(shù)據(jù)庫中的數(shù)據(jù)將被拷貝到文檔中相應(yīng)的文本域中。 你還可以通過重復(fù)點(diǎn)擊Next和Merge按鈕來合并不同的數(shù)據(jù)到文檔中。
該示例中使用的數(shù)據(jù)源來自一個(gè)XML文件,文件中包含一些地址信息。打開【Address Database】窗體以及每次點(diǎn)擊【Previous】和【Next】按鈕都會(huì)通過GetRecord()方法來取得數(shù)據(jù):
[C#]
private void GetRecord()
{
DataRow Row = dsAddress.Tables[0].Rows[CurrentRow];
lblCompany.Text = Row["company"].ToString();
lblRecipient.Text = Row["recipient"].ToString();
lblStreet.Text = Row["street"].ToString();
lblCity.Text = Row["city"].ToString();
lblCountry.Text = Row["country"].ToString();
lblSalutation.Text = Row["salutation"].ToString();
SetButtonState();
}
點(diǎn)擊【Merge】按鈕時(shí),數(shù)據(jù)源中的數(shù)據(jù)將被拷貝到文檔的相應(yīng)的文本域中,文本域與數(shù)據(jù)源中的字段有著相同名字,所以通過For Each操作可以完成這個(gè)拷貝工作:
[C#]
private void cmdMerge_Click(object sender, System.EventArgs e)
{
foreach (TXTextControl.TextField Field in tx.TextFields)
{
Field.Text = dsAddress.Tables[0].Rows[CurrentRow][Field.Name].ToString();
}
}
第二步:打印操作
在【Address Database】窗體中添加一個(gè)【Print】按鈕,當(dāng)點(diǎn)擊【Print】按鈕時(shí),程序會(huì)將數(shù)據(jù)源中的記錄合并到文檔中并進(jìn)行打印操作:
[C#]
private void cmdPrint_Click(object sender, System.EventArgs e)
{
PrintDocument PrintDoc = new PrintDocument();
foreach (DataRow CurrentRow in dsAddress.Tables[0].Rows)
{
// Merge data from current record
foreach (TXTextControl.TextField Field in tx.TextFields)
Field.Text = CurrentRow[Field.Name].ToString();
// Print
PrintDoc.PrinterSettings.FromPage = 0;
PrintDoc.PrinterSettings.ToPage = tx.Pages;
tx.Print(PrintDoc);
}
}
由于打印操作會(huì)自動(dòng)將數(shù)據(jù)進(jìn)行合并,所以不再需要步驟一中的【Merge】按鈕,同時(shí)使用Grid來顯示數(shù)據(jù)源中的數(shù)據(jù),這樣可以更好的瀏覽數(shù)據(jù)源中的數(shù)據(jù)
第三步:創(chuàng)建模板文檔
加載、保存和導(dǎo)入文件
在 第一和第二步中程序會(huì)自動(dòng)加載template.tx模板文件,所以不能加載其它模板文檔,也不能保存文檔。因此需要修改加載文件相關(guān)的代碼,通過一個(gè)文 件對話框來選擇需要加載的模板文檔,同時(shí)添加【Saveing】和【Importing】菜單項(xiàng),需要注意的是只有將文檔保存為TX Text Control的格式才能保留文檔中的文本域。而用戶可以通過【SaveFile】對話框來講文檔保存了其它格式的文件:
[C#]
private void mnuFile_SaveTemplateAs_Click(object sender, System.EventArgs e)
{
dlgSaveFile.Filter = "Text Control Files (*.tx)|*.tx";
dlgSaveFile.ShowDialog();
if (dlgSaveFile.FileName != "")
textControl1.Save(dlgSaveFile.FileName,
TXTextControl.StreamType.InternalFormat);
}
添加數(shù)據(jù)庫字段
第一和第二步中包含了必須的文本域,為了創(chuàng)建更靈活的文件,應(yīng)用程序應(yīng)該提供給用戶選擇數(shù)據(jù)庫字段的功能,由用戶來決定將哪些字段添加到模板文檔中。在程序中添加一個(gè)【Insert】菜單,菜單包含數(shù)據(jù)源中的所有列:
然而,每個(gè)數(shù)據(jù)源可能包含不同的列信息,【Insert】菜單也需要?jiǎng)討B(tài)創(chuàng)建。數(shù)據(jù)源中的每列就對應(yīng)【Insert】菜單的一個(gè)菜單項(xiàng),當(dāng)點(diǎn)擊這些菜單項(xiàng)時(shí),會(huì)在文檔中穿件相應(yīng)的文本域:
[C#]
private void CreateTextFieldMenu()
{
mnuInsert.MenuItems.Clear();
foreach (DataColumn DataField in dsAddress.Tables[0].Columns)
mnuInsert.MenuItems.Add(DataField.ColumnName,
new EventHandler(InsertMenuItems_Click));
}
private void InsertMenuItems_Click(object sender, System.EventArgs e)
{
TXTextControl.TextField textField = new TXTextControl.TextField();
textField.Text = "(" + ((MenuItem)sender).Text + ")";
textField.Name = ((MenuItem)sender).Text;
textField.ShowActivated = true;
textField.DoubledInputPosition = true;
textControl1.TextFields.Add(textField);
}
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:葡萄城控件技術(shù)團(tuán)隊(duì)博客