《Visual C# NET案例教程》課件第9章_第1頁
《Visual C# NET案例教程》課件第9章_第2頁
《Visual C# NET案例教程》課件第9章_第3頁
《Visual C# NET案例教程》課件第9章_第4頁
《Visual C# NET案例教程》課件第9章_第5頁
已閱讀5頁,還剩82頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第9章圖書維護

9.1圖書維護窗體介紹9.2DataSet對象9.3DataAdapter對象9.4DataTable對象9.5圖書維護窗體的實現(xiàn)9.6水晶報表9.7知識拓展9.8習(xí)題圖書維護窗體實現(xiàn)了對圖書信息的增加、刪除和修改,窗體如圖9-1所示,單擊“增加”按鈕,彈出如圖9-2所示的增加圖書窗體。9.1圖書維護窗體介紹圖9-1圖書維護窗體圖9-2增加圖書窗體

DataSet可以視為一個內(nèi)存數(shù)據(jù)庫,由許多數(shù)據(jù)表、數(shù)據(jù)表聯(lián)系(Relation)、約束(Constraint)、記錄(Row)以及字段(Column)對象的集合所組成。

DataSet的結(jié)構(gòu)與數(shù)據(jù)庫相似,由一個或多個DataTable組成,DataTable相當(dāng)于數(shù)據(jù)庫中的表。其中列DataColumn與行DataRow分別對應(yīng)于數(shù)據(jù)庫的字段與數(shù)據(jù)行。DataSet中的數(shù)據(jù)存放在DataTable中。DataSet、DataTable的結(jié)構(gòu)如圖9-3所示。9.2DataSet對象圖9-3DataSet、DataTable的結(jié)構(gòu)

DataSet對象一個重要的特性是離線操作,即從數(shù)據(jù)庫中取回數(shù)據(jù),存到DataSet對象中后,程序可以馬上斷開與數(shù)據(jù)庫的連接,用戶可以對內(nèi)存中DataSet中的數(shù)據(jù)進行增加、刪除等修改,而當(dāng)需要把改動反映到數(shù)據(jù)庫時,只要重新與數(shù)據(jù)庫建立連接,并利用相應(yīng)的命令實現(xiàn)更新即可。這意味著程序和數(shù)據(jù)庫的連接時間可以盡可能縮短,減少對數(shù)據(jù)庫服務(wù)器資源的占用。由于DataSet對象本身不具備和數(shù)據(jù)源溝通的能力,因此要修改、更新數(shù)據(jù)并返回數(shù)據(jù)源時,需要DataAdapter對象。

DataAdapter提供的是對于數(shù)據(jù)集的填充和對更新的回傳任務(wù),對于DataSet來說,DataAdapter有點像一個搬運工,把數(shù)據(jù)從數(shù)據(jù)庫“搬運”到DataSet中,DataSet中的數(shù)據(jù)有了改動的時候,又可以把這些改動“反映”給數(shù)據(jù)庫。而DataAdapter做這件事情,靠的是它所包含的4個Command對象:9.3DataAdapter對象●?SelectCommand 用于在數(shù)據(jù)源中選擇記錄的SQL命令。

●?InsertCommand 用來在數(shù)據(jù)源中插入新記錄的SQL命令。

●?UpdateCommand用于更新數(shù)據(jù)源中記錄的SQL命令。

●?DeleteCommand 用來從數(shù)據(jù)集刪除記錄的SQL命令。

創(chuàng)建DataAdapter一般用以下方式:

SqlDataAdapterda=newSqlDataAdapter(selectSQL,Connection);其中,selectSQL為返回數(shù)據(jù)集的Select語句,Connection用于指定所用的連接。這種方式等價于另一種常用的DataAdapter創(chuàng)建方式:

SqlDataAdapterda=newSqlDataAdapter(); //創(chuàng)建DataAdapter

SqlCommandcmd=newSqlCommand(selectSQL,conn);//創(chuàng)建Command

da.SelectCommand=cmd; //給DataAdapter的SelectCommand賦值利用DataAdapter對象的Fill方法把數(shù)據(jù)填充到DataSet。DataAdapter使用的Connection對象并不需先用Open方法打開。調(diào)用DataAdapter的Fill方法時,如果Connection沒有打開,DataAdapter會自動調(diào)用Connection的Open方法;DataAdapter對數(shù)據(jù)源的操作完畢后,會自動將Connection關(guān)閉。如果在執(zhí)行Fill方法時Connection已打開,在執(zhí)行完畢后DataAdapter會維持Connection打開狀態(tài)。

DataTable是構(gòu)成DataSet最主要的對象,DataTable對象是由DataColumns集合以及DataRows集合所組成的,DataSet的數(shù)據(jù)就存放在DataTable對象中。DataTable對象的常用屬性見表9-1。9.4DataTable對象表9-1DataTable對象的常用屬性

DataTable對象的常用方法:

●?AcceptChanges 確定DataTable所作的改變。

●?Clear 清除DataTable內(nèi)所有的數(shù)據(jù)。

●?NewRow 增加一筆新的記錄。

DataColumn對象就是字段對象,是組成數(shù)據(jù)表DataTable的基本單位。DataColumn的屬性見表9-2。表9-2DataColumn的屬性

【例9-1】下面的例子把圖書表中的數(shù)據(jù)取到DataSet中,然后把DataSet中的內(nèi)容顯示出來,運行結(jié)果如圖9-4所示。

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

usingSystem.Data;

usingSystem.Data.SqlClient;//引入數(shù)據(jù)庫相關(guān)名稱空間

classProgram

{

staticvoidMain(string[]args)

{

SqlConnectionconn=newSqlConnection("server=PC-20101005APPX;database=BookDB;integratedsecurity=true");

SqlDataAdapterda=newSqlDataAdapter("select*from圖書表",conn);

DataSetds=newDataSet();

da.Fill(ds);//填充數(shù)據(jù)到ds

for(inti=0;i<ds.Tables[0].Rows.Count;i++)

{

Console.WriteLine(ds.Tables[0].Rows[i]["圖書編號"].ToString()+"\t"+ds.Tables[0].Rows[i]["書名"].ToString());

}

}

}圖9-4例9-1運行結(jié)果【例9-2】動態(tài)生成內(nèi)存表DataTable,運行結(jié)果如圖9-5所示。圖9-5例9-2運行結(jié)果

新建一個Windows項目,從工具欄向窗體拖入一個DataGridView控件;雙擊窗體,切換到代碼窗口,為Form1的Load事件編寫如下代碼:

privatevoidForm1_Load(objectsender,EventArgse)

{

//創(chuàng)建內(nèi)存表DataTable

DataTabletable=newDataTable("book");

table.Columns.Add("BookID"); //增加Index列

table.Columns.Add("BookName"); //增加BookName列

DataRowrow=table.NewRow(); //產(chǎn)生一個行DataRow,該行的結(jié)構(gòu)與DataTable的行結(jié)構(gòu)相同

row["BookID"]="C0008";

row["BookName"]="ASP.NET程序設(shè)計";

table.Rows.Add(row);

row=table.NewRow();

row["BookID"]="C0009";

row["BookName"]="數(shù)據(jù)庫原理";

table.Rows.Add(row); //把DataRow加入到DataTable

dataGridView1.DataSource=table;

}【例9-3】利用DataSet和DataAdapter實現(xiàn)數(shù)據(jù)的增、刪、改。

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

usingSystem.Data;

usingSystem.Data.SqlClient;

classProgram

{

staticvoidMain(string[]args)

{

stringconnStr="server=PC-20101005APPX;database=bookdb;integratedsecurity=true";

SqlConnectionconn=newSqlConnection(connStr);

SqlDataAdapterda=newSqlDataAdapter("select*from圖書表",conn);

DataSetds=newDataSet();da.Fill(ds);

//插入新的一行

DataRowdr1=ds.Tables[0].NewRow();

dr1["圖書編號"]="88";

dr1["書名"]="ASP.NET項目開發(fā)教程";

dr1["作者"]="李四";

ds.Tables[0].Rows.Add(dr1);

//更新第二行

DataRowdr2=ds.Tables[0].Rows[1];

dr2["書名"]="C#經(jīng)典";

//刪除第五行

ds.Tables[0].Rows[2].Delete();

SqlCommandBuildercb=newSqlCommandBuilder(da);

da.Update(ds.Tables[0]);

}

}程序說明:

在上面的程序中,我們調(diào)用DataAdapter的Update方法實現(xiàn)對數(shù)據(jù)庫的更新:

da.Update(ds,“Books”);

在處理數(shù)據(jù)的時候,DataRow對象會自動記錄目前記錄的狀況,只要記錄一有改變便做標(biāo)記。等調(diào)用DataAdapter對象的Update方法時,DataAdapter會根據(jù)DataSet中數(shù)據(jù)的增、刪、改等情況,使用適當(dāng)?shù)腟QL命令將修改更新至數(shù)據(jù)源。Update這個方法會檢查每一個DataRow的狀態(tài),若DataRow是新增加的,該方法就執(zhí)行Insert的SQL命令;若DataRow被修改過,該方法就執(zhí)行Update的SQL命令;若DataRow被刪除,則執(zhí)行Delete的SQL命令。那么,實現(xiàn)更新的Insert、Update、Delete這些SQL從哪來呢?DataAdapter中有四個Command對象屬性,分別是SelectCommand、InsertCommand、UpdateCommand以及DeleteCommand屬性。我們可以預(yù)先準(zhǔn)備好這幾個Command,需要時DataAdapter會自動調(diào)用。但我們并未對DataAdapter的幾個Command賦值,因為要產(chǎn)生這些Command比較麻煩,系統(tǒng)提供了一個簡化的方法,即利用CommandBuilder對象自動構(gòu)建。本例中對應(yīng)的實現(xiàn)語句為:

SqlCommandBuildercb=newSqlCommandBuilder(da);

DataSet中的數(shù)據(jù)必須至少存在一個主鍵列或唯一列,否則,調(diào)用Update()時將產(chǎn)生異常,不會生成自動更新數(shù)據(jù)庫的INSERT、UPDATE或DELETE命令。下面介紹實現(xiàn)圖書維護窗體,效果如圖9-6所示。

圖書維護V1.0的實現(xiàn)步驟如下:

(1)新建一個Windows應(yīng)用程序BookEdit。

(2)添加一個名為FrmBook的窗體。

(3)如圖所示設(shè)計FrmBook的窗體界面。9.5圖書維護窗體的實現(xiàn)圖9-6圖書維護窗體設(shè)計界面(4)編寫FrmBook窗體的代碼。

usingSystem;

usingSystem.Collections.Generic;

usingSystem.ComponentModel;

usingSystem.Data;

usingSystem.Data.SqlClient;

usingSystem.Drawing;

usingSystem.Text;

usingSystem.Windows.Forms;

namespaceBook

{

publicpartialclassFrmBook:Form

{publicstaticSqlConnectionconn=newSqlConnection("server=PC-20101005APPX;database=bookdb;integratedsecurity=true");

publicFrmBook()

{

InitializeComponent();

}

//加載數(shù)據(jù)

privatevoidFrmBook_Load(objectsender,EventArgse)

{

dataGridView1.AutoGenerateColumns=true;

panel3.BringToFront();

bind();

}//綁定數(shù)據(jù)

voidbind()

{

DataSetds=newDataSet();

SqlCommandcmd=newSqlCommand("select*from圖書表",conn);

SqlDataAdapterda=newSqlDataAdapter(cmd);

da.Fill(ds);

dataGridView1.DataSource=ds.Tables[0];

}

//單擊“增加”按鈕

privatevoidtsbAdd_Click(objectsender,EventArgse)

{

FrmAddfrm=newFrmAdd();frm.bookNO=dataGridView1.CurrentRow.Cells["圖書編號"].Value.ToString();

frm.Text="增加圖書";

frm.ShowDialog();

bind();

}

//單擊“刪除”按鈕

privatevoidtsbDelete_Click(objectsender,EventArgse)

{

try

{

if(MessageBox.Show("確定要刪除該圖書嗎?","提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Question)==DialogResult.OK){

ExecuteCommand("delete圖書表where圖書編號="+dataGridView1.CurrentRow.Cells["圖書編號"].Value.ToString());

bind();

MessageBox.Show("刪除數(shù)據(jù)成功!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);

}

}

catch(Exceptionex)

{

MessageBox.Show(ex.Message,"提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Information);

}

}//單擊“編輯”按鈕

privatevoidtsbEdit_Click(objectsender,EventArgse)

{

FrmAddfrm=newFrmAdd();

frm.Text="修改圖書";

frm.fill(dataGridView1.CurrentRow.Cells["圖書編號"].Value.ToString());

frm.ShowDialog();

bind();

}

//單擊“關(guān)閉”按鈕

privatevoidtsbClose_Click(objectsender,EventArgse)

{

Close();

}

//執(zhí)行并返回影響行數(shù)

publicstaticintExecuteCommand(stringsql,paramsSqlParameter[]values)

{

SqlCommandcmd=newSqlCommand(sql,conn);

cmd.Parameters.AddRange(values);

conn.Open();

intresult=cmd.ExecuteNonQuery();

conn.Close();

returnresult;

}

//雙擊單元格

privatevoiddataGridView1_CellDoubleClick(objectsender,DataGridViewCellEventArgse)

{

tsbEdit_Click(null,null);

}

}

}(5)添加一個名為FrmAdd的窗體,界面如圖9-7所示。圖9-7增加/修改圖書窗體設(shè)計代碼如下:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.ComponentModel;

usingSystem.Data;

usingSystem.Drawing;

usingSystem.Text;

usingSystem.Windows.Forms;

usingSystem.Data.SqlClient;

namespaceBook

{

publicpartialclassFrmAdd:Form

{

publicstringbookNO;publicFrmAdd()

{

InitializeComponent();

}

publicvoidfill(stringbookNO)

{

SqlConnectionconn=newSqlConnection("server=PC-20101005APPX;database=bookdb;integratedsecurity=true");

DataSetds=newDataSet();

SqlCommandcmd=newSqlCommand("select*from圖書表where圖書編號='"+bookNO+"'",conn);

SqlDataAdapterda=newSqlDataAdapter(cmd);

da.Fill(ds);

txtISBN.Text=ds.Tables[0].Rows[0][1].ToString();txtBookName.Text=ds.Tables[0].Rows[0][2].ToString();

txtAuthor.Text=ds.Tables[0].Rows[0][3].ToString();

txtPrice.Text=ds.Tables[0].Rows[0][4].ToString();

txtPublisher.Text=ds.Tables[0].Rows[0][5].ToString();

datePublisher.Value=Convert.ToDateTime(ds.Tables[0].Rows[0][6]);

txtQty.Text=ds.Tables[0].Rows[0][7].ToString();

this.bookNO=bookNO;

}

privatevoidbutton1_Click(objectsender,EventArgse)

{

stringsql;

if(this.Text=="增加圖書")

{

sql="INSERTINTO圖書表(ISBN,書名,作者,價格,出版社,出版日期,庫存數(shù))VALUES(@isbn,@bookName,@author,@price,@publisher,@pubDate,@qty)";

SqlParameter[]param=newSqlParameter[]{

newSqlParameter("isbn",txtISBN.Text),

newSqlParameter("bookName",txtBookName.Text),

newSqlParameter("author",txtAuthor.Text),

newSqlParameter("price",txtPrice.Text),

newSqlParameter("publisher",txtPublisher.Text),

newSqlParameter("pubDate",datePublisher.Value),

newSqlParameter("qty",txtQty.Text)

};

FrmBook.ExecuteCommand(sql,param);

MessageBox.Show("成功增加一條記錄");

}

elseif(this.Text=="修改圖書")

{

sql="UPDATE圖書表SETISBN=@isbn,書名=@bookName,作者=@author,價格=@price,出版社=@publisher,出版日期=@pubDate,庫存數(shù)=@qtyWHERE圖書編號=@bookNO";

SqlParameter[]param=newSqlParameter[]{

newSqlParameter("isbn",txtISBN.Text),

newSqlParameter("bookName",txtBookName.Text),

newSqlParameter("author",txtAuthor.Text),

newSqlParameter("price",txtPrice.Text),

newSqlParameter("publisher",txtPublisher.Text),

newSqlParameter("pubDate",datePublisher.Value),

newSqlParameter("qty",txtQty.Text),

newSqlParameter("bookNO",bookNO)

};

FrmBook.ExecuteCommand(sql,param);

MessageBox.Show("記錄修改成功!");

}

}

}

}9.6.1拉模式與推模式

1.拉模式

在拉模式中,驅(qū)動程序?qū)⑦B接到數(shù)據(jù)庫并根據(jù)需要將數(shù)據(jù)“拉”進來。使用這種模式時,與數(shù)據(jù)庫的連接和為了獲取數(shù)據(jù)而執(zhí)行的SQL命令同時由CrystalReports本身處理,不需要開發(fā)人員編寫代碼。

如果在運行時無須編寫任何特殊代碼,則使用拉模式。9.6水晶報表

2.推模式

推模式需要開發(fā)人員編寫代碼以連接到數(shù)據(jù)庫,執(zhí)行SQL命令以創(chuàng)建與報表中的字段匹配的記錄集或數(shù)據(jù)集,并且將該對象傳遞給報表。該方法可以將連接共享置入應(yīng)用程序中,并在CrystalReports收到數(shù)據(jù)之前先將數(shù)據(jù)篩選出來。

相比拉模式,推模式有更大的靈活性,下面僅介紹推模式的報表開發(fā)方式。9.6.2報表設(shè)計

報表設(shè)計界面如圖9-8所示,報表分為若干個報表節(jié),如“報表頁眉”、“頁腳和詳細(xì)資料”,可將對象拖動到某個報表節(jié)上。圖9-8報表設(shè)計界面●“報表頁眉”:放在“報表頁眉”節(jié)中的對象只在報表開頭輸出顯示一次?!皥蟊眄撁肌惫?jié)通常包含報表的標(biāo)題和其他希望只在報表開始位置出現(xiàn)的信息。放在該節(jié)中的公式只在報表開始處進行一次求值。

●“頁眉”:放在“頁眉”節(jié)中的對象輸出顯示在每個新頁的開始位置。“頁眉”節(jié)通常包含希望在每頁頂部出現(xiàn)的信息,它可以包括文本字段(如章節(jié)名、文檔名或其他類似信息),該節(jié)也可以用來包含字段標(biāo)題,在報表中這些字段標(biāo)題將作為標(biāo)簽顯示在字段數(shù)據(jù)列的頂部。圖表或交叉表不能放置在該節(jié)中。放在該節(jié)中的公式在每個新頁的開始進行一次求值。●“詳細(xì)資料”:放在“詳細(xì)資料”部分中的對象隨每條新記錄輸出顯示。“詳細(xì)資料”部分包含報表正文數(shù)據(jù)。當(dāng)報表運行時,“詳細(xì)資料”部分隨每條記錄重復(fù)輸出顯示。例如,如果向“詳細(xì)資料”部分中添加了一個數(shù)據(jù)庫對象,而這個數(shù)據(jù)庫對象包含100條記錄,那么報表在運行時將輸出顯示100個單獨的“詳細(xì)資料”部分。圖表或交叉表不能放置在該節(jié)中。放在該節(jié)中的公式對每條記錄進行一次求值。

●“報表頁腳”:放在“報表頁腳”節(jié)中的對象只在報表的結(jié)束位置輸出顯示一次。該節(jié)可用來包含希望只在報表的末尾出現(xiàn)一次的信息(如總計),放在該節(jié)中的圖表和交叉表包含整個報表的數(shù)據(jù),放在該節(jié)中的公式只在報表的結(jié)束位置進行一次求值?!瘛绊撃_”:放在“頁腳”節(jié)中的對象輸出顯示在每頁的底部。該節(jié)通常包含頁碼和任何其他希望出現(xiàn)在每頁底部的信息。圖表和交叉表不能放置在該節(jié)中。放在該節(jié)中的公式在每個新頁面的結(jié)束位置進行一次求值。

●其他報表節(jié):如果將組、摘要或小計添加到報表中,則會創(chuàng)建另外兩個節(jié):“組頁眉”和“組頁腳”。當(dāng)添加了組、摘要或小計時,“組頁眉”節(jié)出現(xiàn)在“詳細(xì)資料”部分的正上方,而“組頁腳”節(jié)出現(xiàn)在“詳細(xì)資料”部分的正下方。跟原始報表節(jié)一樣,每個新添加的節(jié)也可以包含一個或多個子節(jié)。●“組頁眉”:放在“組頁眉”節(jié)中的對象輸出顯示在每個新組的開始位置。該節(jié)通常保存組名字段,也可以用來顯示包括組特定數(shù)據(jù)的圖表或交叉表?!敖M頁眉”節(jié)在每組的開始位置輸出顯示一次。放在該節(jié)中的圖表和交叉表僅包含本組數(shù)據(jù)。放在該節(jié)中的公式在每組的開始對本組進行一次求值。

●“組頁腳”:放在“組頁腳”節(jié)中的對象輸出顯示在每組的結(jié)束位置。該節(jié)通常保存匯總數(shù)據(jù)(如果有),也可以用來顯示圖表或交叉表?!敖M頁腳”節(jié)在每組的結(jié)束位置輸出顯示一次。放在該節(jié)中的圖表和交叉表僅包含本組數(shù)據(jù)。放在該節(jié)中的公式在每組的結(jié)束位置對本組進行一次求值。9.6.3制作圖書信息的報表

下面介紹制作圖書信息的報表,報表效果如圖9-9所示。圖9-9報表效果圖書維護V2.0的實現(xiàn)步驟如下:

(1)用VS2005打開圖書維護項目。

(2)建立數(shù)據(jù)集。

①單擊菜單“項目”→“添加新項”,彈出“添加新項”窗口,在“模板”列表中選中數(shù)據(jù)集,如圖9-10所示。單擊“添加”按鈕,出現(xiàn)如圖9-11所示DataSet1.xsd設(shè)計界面。圖9-10“添加新項”窗口圖9-11DataSet1.xsd設(shè)計界面②從“工具箱”的“數(shù)據(jù)集”欄拖動一個TableAdapter到DataSet1.xsd設(shè)計頁面,彈出如圖9-12所示的窗口,新建一個連接或選擇好數(shù)據(jù)庫連接,單擊“下一步”按鈕。圖9-12新建連接③彈出如圖9-13所示窗口,選中“使用SQL語句”,單擊“下一步”按鈕。圖9-13選擇“使用SQL語句”④彈出如圖9-14所示的“TableAdapter”窗口,輸入“select*from圖書表”。圖9-14輸入SQL語句⑤單擊“完成”按鈕,DataSet1.xsd中多了一個DataTabe,如圖9-15所示。圖9-15完成的DataSet1.xsd界面

(3)創(chuàng)建報表。

①單擊菜單“項目”→“添加新項”,彈出“添加新項”窗口,在“模板”列表中選中“Crystal報表”,如圖9-16所示;單擊“添加”按鈕,彈出如圖9-17所示的“CrystalReports庫”窗口;單擊“確定”按鈕,彈出“標(biāo)準(zhǔn)報表創(chuàng)建向?qū)А?,如圖9-18所示。圖9-16“添加新項”窗口圖9-17選擇使用“報表向?qū)А眻D9-18“標(biāo)準(zhǔn)報表創(chuàng)建向?qū)А贝翱冖谡归_ADO.NET節(jié)點,選中“圖書表項”,單擊按鈕,把“圖書表”選擇到右邊“選定的表”列表中。單擊“下一步”按鈕,彈出如圖9-19所示的窗口;單擊按鈕,把所有字段添加到右邊“要顯示的字段”列表中;單擊“完成”按鈕,系統(tǒng)界面進入如圖9-20所示的報表設(shè)計界面。圖9-19選擇要顯示的字段圖9-20初始報表設(shè)計界面③取消“頁眉”部分的其他列標(biāo)題的下劃線。

選中“頁眉”部分的所有標(biāo)題字段,在“屬性”窗口展開Font節(jié)點,設(shè)置Undeline屬性為False。

④繪制表格。

在報表設(shè)計界面上右擊鼠標(biāo),在彈出菜單中選擇“插入”→“框”。鼠標(biāo)圖標(biāo)變?yōu)楫嫻P的形狀,拖到鼠標(biāo),畫出一個矩形方框。效果如圖9-21所示。圖9-21繪制表格調(diào)整好報表各元素的大小與位置,如圖9-22所示。圖9-22調(diào)整好報表各元素

在報表設(shè)計界面上右擊鼠標(biāo),在彈出菜單中選擇“插入”→“框”。鼠標(biāo)圖標(biāo)變?yōu)楫嫻P的形狀,在“詳細(xì)資料”欄下方劃一條橫線。如圖9-23所示。圖9-23在“詳細(xì)資料”欄下方劃一條橫線

在報表設(shè)計界面上右擊鼠標(biāo),在彈出菜單中選擇“插入”→“框”。鼠標(biāo)圖標(biāo)變?yōu)楫嫻P的形狀,在圖書編號與ISBN字段間畫豎線,然后對豎線進行復(fù)制、粘貼操作,在其他各字段間插入豎線。如圖9-24所示。圖9-24字段間畫豎線

(4)制作報表窗體。

①向項目添加一個窗體,命名為FrmReport。

②從工具箱的CrystalReports欄向FrmReport窗體拖動一個CrystalReportViewer控件。設(shè)置其DisplayGroupTree屬性為False。

③為FrmReport窗體的Load事件編寫如下代碼:usingSystem.Data.SqlClient;

usingCrystalDecisions.CrystalReports.Engine;

privatevoidForm1_Load(objectsender,EventArgse)

{SqlConnectionconn=newSqlConnection(“server=PC-20101005APPX;

database=bookdb;integratedsecurity=true");

DataSetds=newDataSet();

stringsql="select*FROM圖書表";

SqlCommandcmd=newSqlCommand(sql,conn);

SqlDataAdapterda=newSqlDataAdapter(cmd);

da.Fill(ds);

ReportDocumentreportDocument=newReportDocument();

reportDocument.Load(Application.StartupPath+“\\CrystalReport1.rpt”);

reportDocument.SetDataSource(ds.Tables[0]);

crystalReportViewer1.ReportSource=reportDocument;

}

(5)把CrystalReport1.rpt文件拷到項目的bin/debug目錄下,運行項目。9.7.1DataView對象

ADO.NET提供了一個可以自定義數(shù)據(jù)外觀的DataView對象,是一種用來幫助設(shè)置DataTable中的數(shù)據(jù)如何顯示的對象,其本身并不包含DataTable中的數(shù)據(jù)。通過DataView對象可以過濾、排序和查找對應(yīng)DataTable中的數(shù)據(jù)。對DataView對象所執(zhí)行的任何操作都會影響原來的DataTable中的數(shù)據(jù)。9.7知識拓展

DataTable提供了一個DefaultView屬性,DefaultView屬性本身就是DataView對象,可以通過設(shè)置DefaultView的屬性來指定DataTable的顯示格式。如果DefaultView這個DataView對象無法滿足需求,還可以建立多個DataView對象來制定數(shù)據(jù)的顯示格式。其聲明語法如下所示:

DataViewdataView=newDataView(數(shù)據(jù)表)

DataView對象的常用屬性及方法見表9-3。表9-3DataView對象的常用屬性及方法排序數(shù)據(jù)時可以使用DataView對象的Sort屬性。Sort屬性以字段作為排序的依據(jù),其基本語法如下:

DataView.Sort="字段ASC|DESC"

篩選記錄可以使用DataView對象的RowFilter屬性以及RowStateFilter屬性。RowFilter屬性可以利用比較運算符?<、>、<=、>=?以及Like來過濾記錄中的數(shù)據(jù),其語法如下所示:

DataView.RowFilter="過濾條件"

例如,查詢Country列等于USA的數(shù)據(jù),可寫成:

DataView.RowFilter="Country='USA'"9.7.2數(shù)據(jù)庫公用類

從軟件工程的角度,代碼要盡可能的實現(xiàn)重用,或者說,同樣的代碼要避免寫兩次。在前面的編程中,可以感覺到數(shù)據(jù)庫操作的代碼有許多重復(fù)的地方。因此,可以把對數(shù)據(jù)庫操作的共同部分提煉出來,封裝到一個類中。以后可以調(diào)用類中的方法,輕松地實現(xiàn)數(shù)據(jù)庫的操作,并把編程的精力集中在實現(xiàn)應(yīng)用的邏輯上。該類DbHelper.cs的內(nèi)容如下:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

usingSystem.Data;

usingSystem.Data.SqlClient;

classDBHelp

{

privateSqlConnectionconn;

publicDBHelp()

{

conn=newSqlConnection(“server=PC-20101005APPX;database=

bookdb;integratedsecurity=true");

}//執(zhí)行并返回影響行數(shù)

publicintExecuteCommand(stringsql)

{

SqlCommandcmd=newSqlCommand(sql,conn);

OpenConn();

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論