亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

透過vs.net數(shù)據(jù)窗體向?qū)Э碅do.net

系統(tǒng) 2250 0

作者:鄭佐 2005-1-1

csdn 上經(jīng)常碰到有人問一些 Ado.net 的問題,特別是開發(fā)信息管理系統(tǒng)之類的跟數(shù)據(jù)庫比較密切的程序時,在數(shù)據(jù)和界面層的開發(fā)中會遇到不少常見問題,下面我們通過 vs.net 自帶的數(shù)據(jù)窗體向?qū)砜纯茨芩軒臀覀儧Q絕什么問題。

一.使用向?qū)?

新建 Windows 應用程序,為當前項目添加組件,選擇數(shù)據(jù)窗體向?qū)В@里名稱填寫為 DataForm1.cs 。單擊打開出現(xiàn)數(shù)據(jù)窗體向?qū)υ捒颉?chuàng)建新的類型化數(shù)據(jù)集 MyDataSet 。使用本地數(shù)據(jù)連接向?qū)В@里我選擇 Northwind 庫作為數(shù)據(jù)源。在選擇表或視圖那一步添加 Categories 表和 Products 表。添加一個表之間的關系取名 CategoryProductRel 。在選擇顯示樣式一步中選擇顯示數(shù)據(jù)的方式為單個控件中的單個記錄,這個就會有數(shù)據(jù)綁定到文本框。可以用數(shù)據(jù)導航來選擇父表的記錄。向?qū)瓿珊髸梢粋€ OleDbConnection ,幾個表生成幾個 OleDbDataAdapter 負責數(shù)據(jù)的獲取和更新。另外就是一個強類型的數(shù)據(jù)集。

整個程序的運行界面如下:

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"></shapetype><stroke joinstyle="miter"></stroke><formulas></formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f><lock aspectratio="t" v:ext="edit"></lock>

透過vs.net數(shù)據(jù)窗體向?qū)Э碅do.net
基本功能都包括了,不過等你點擊幾下,程序界面上就會出現(xiàn)小的 bug ,微軟可能也估計到?jīng)]有人會要這個窗體來處理數(shù)據(jù),不過這個不是我們所關心的。

二.數(shù)據(jù)填充

先來看看數(shù)據(jù)集結構:

透過vs.net數(shù)據(jù)窗體向?qū)Э碅do.net
一個 Categories 表作為父表, Products 表作為子表, CategoryID 為外鍵,建立的數(shù)據(jù)表關系。

通過加載按鈕數(shù)據(jù)庫中的相關數(shù)據(jù)會被填充到數(shù)據(jù)集。執(zhí)行的 LoadDataSet() 方法的過程如下:

使用 DataAdatpter.Fill() 方法填充數(shù)據(jù)到臨時的一個數(shù)據(jù)集,如果操作成功,將合并這個臨時數(shù)據(jù)集到原有的數(shù)據(jù)集, DataGrid 通過表關系綁定子表。

// 嘗試填充臨時數(shù)據(jù)集。

this .FillDataSet(objDataSetTemp);

grdProducts.DataSource = null ;

// 清空數(shù)據(jù)集中的舊記錄。

objMyDataSet.Clear();

// 將記錄合并到主數(shù)據(jù)集中。

objMyDataSet.Merge(objDataSetTemp);

grdProducts.SetDataBinding(objMyDataSet, "Categories.CategoryProductRel");

在數(shù)據(jù)填充的方法中我們注意到

dataSet.EnforceConstraints = false ;

這一步會對數(shù)據(jù)填充效率會有所提高。

另外還有一個細節(jié)就是執(zhí)行兩個以上 DataAdapter 的數(shù)據(jù)訪問方法時顯式打開關閉數(shù)據(jù)連接效率會比較高。因為在執(zhí)行 DataAdapter 的數(shù)據(jù)更新方法前和方法后數(shù)據(jù)連接 Connection 實例的狀態(tài)不會改變。如果下面代碼。

//this.oleDbConnection1.Open();

this .oleDbDataAdapter1.Fill(dataSet);

this .oleDbDataAdapter2.Fill(dataSet);

執(zhí)行之前 Connection 的狀態(tài)是關閉的,那可想而知這一過程會執(zhí)行兩次打開連接關閉連接。

其實一次就夠。

為了數(shù)據(jù)的嚴密性,填充完數(shù)據(jù)后不要忘了加上下面代碼,

// 重新打開約束檢查。

dataSet.EnforceConstraints = true ;

如果是直讀那就無所謂了。

有了數(shù)據(jù)填充那就來看數(shù)據(jù)的單值綁定和多值綁定。

三.數(shù)據(jù)綁定

數(shù)據(jù)的單值綁定如下:

this .editCategoryID.DataBindings.Add( new System.Windows.Forms.Binding("Text", this .objMyDataSet, "Categories.CategoryID"));

this .editCategoryName.DataBindings.Add( new System.Windows.Forms.Binding("Text", this .objMyDataSet, "Categories.CategoryName"));

上面一段代碼把數(shù)據(jù)表的列綁定到了 TextBox Text 屬性上。

數(shù)據(jù)的多值綁定如下:

grdProducts.SetDataBinding(objMyDataSet, "Categories.CategoryProductRel");

可見通過關系綁定數(shù)據(jù)相當方便。

四.數(shù)據(jù)瀏覽

這里通過 BindingContext 對象的索引得到 BindingManagerBase 實例,而 BindingManagerBase.Position 就是我們需要的,通過 Position 來顯示某一行的數(shù)據(jù)記錄。

例如下一條:

this .BindingContext[objMyDataSet,"Categories"].Position = ( this .BindingContext[objMyDataSet,"Categories"].Position + 1);

最后一條:

this .BindingContext[objMyDataSet,"Categories"].Position = ( this .objMyDataSet.Tables["Categories"].Rows.Count - 1);

另外調(diào)用 PositionChanged() 方法來改變導航按鈕之間的索引顯示。

五.數(shù)據(jù)編輯

從添加方法中我們可以看到下面代碼:

// 清除當前編輯內(nèi)容

this .BindingContext[objMyDataSet,"Categories"].EndCurrentEdit();

經(jīng)常有人在 csdn 上提問為什么在編輯 DataGrid TextBox 的時候,只有當編輯框失去焦點的時候才會被保存。要實現(xiàn)不改變焦點就保存可以通過上面代碼實現(xiàn)。

相對應的取消如下:

this .BindingContext[objMyDataSet,"Categories"].CancelCurrentEdit();

刪除數(shù)據(jù)的代碼如下:

this .BindingContext[objMyDataSet,"Categories"].RemoveAt( this .BindingContext[objMyDataSet,"Categories"].Position);

看到上面代碼發(fā)現(xiàn)原來數(shù)據(jù)不是真正的在數(shù)據(jù)源刪除,不過我們開發(fā)的時候可能用的更多的是 DataRow Delete() 方法,這樣能夠提交數(shù)據(jù)更新到數(shù)據(jù)源。

六.數(shù)據(jù)更新

向?qū)傻拇a如下:

public void UpdateDataSet()

{

// 創(chuàng)建一個新數(shù)據(jù)集來保存對主數(shù)據(jù)集所做的更改。

WindowsApplication1.MyDataSet objDataSetChanges = new WindowsApplication1.MyDataSet();

// 停止當前的任何編輯。

this .BindingContext[objMyDataSet,"Categories"].EndCurrentEdit();

this .BindingContext[objMyDataSet,"Products"].EndCurrentEdit();

// 獲取對主數(shù)據(jù)集所做的更改。

objDataSetChanges = ((WindowsApplication1.MyDataSet)(objMyDataSet.GetChanges()));

// 檢查是否做了任何更改。

if ((objDataSetChanges != null ))

{

try

{

// 需要做一些更改,所以嘗試通過調(diào)用 update 方法

// 和傳遞數(shù)據(jù)集以及任何參數(shù)來更新數(shù)據(jù)源。

this .UpdateDataSource(objDataSetChanges);

objMyDataSet.Merge(objDataSetChanges);

objMyDataSet.AcceptChanges();

}

catch (System.Exception eUpdate)

{

// 在此處添加錯誤處理代碼。

throw eUpdate;

}

// 添加代碼以檢查返回的數(shù)據(jù)集中是否有任何可能已被

// 推入到行對象錯誤中的錯誤。

}

}

更新過程很經(jīng)典,通過獲取修改過的數(shù)據(jù)集更新子集提交到數(shù)據(jù)源完成更新動作,接著合并子集到原有數(shù)據(jù)集,順便提一下,合并的過程是基于數(shù)據(jù)表主鍵來判斷的。通過調(diào)用 DataSet.AcceptChanges() 方法提交自加載此 DataSet 或上次調(diào)用 AcceptChanges 以來對 DataSet 進行的所有更改。對應的就是 Data.RejectChanges(); 回滾自創(chuàng)建 DataSet 以來或上次調(diào)用 DataSet.AcceptChanges 以來對 DataSet 進行的所有更改。

七.補充

對于數(shù)據(jù)的更新需要視程序環(huán)境而定,不能都通過獲取子集再合并的方法,具體請看 ADO.NET 中的多數(shù)據(jù)表操作淺析—修改 一文。也有人問起怎樣實現(xiàn)這樣的功能:在數(shù)據(jù)庫中的某一個字段數(shù)據(jù)為 0 1 ,而在程序顯示上想讓它顯示為是或否,這里我認為最好不要在 Sql 語句上做文章,代替的方法就是使用 Binding 對象的 Format 事件和 Parse 事件。 Binding.Format 事件,當將某控件的屬性綁定到某個數(shù)據(jù)值時發(fā)生。 Binding.Parse 事件,在數(shù)據(jù)綁定控件的值更改時發(fā)生。還有可以通過 BindingManagerBase.PositionChanged 事件來設置各個按鈕的狀態(tài)。需要具體的例子可以看 MSDN 或《 Ado.net Core Reference 》一書。另外,使用 Try{}catch (System.Exception ex) {} 還是要視情況而定,不能一味的全都通過 Exception 基類把什么都撲捉了,如果知道有可能會拋出什么類型的異常,還是越具體越好,造成的反面效果就是要寫更多的代碼。具體為什么要這么做可以看《 Applied Microsoft.NET Framework Programming 》一書。

透過vs.net數(shù)據(jù)窗體向?qū)Э碅do.net


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲欧美综合精品成 | 国产精选91热在线观看 | 国产精品99久久久久久宅男 | 手机免费看一级片 | 免费观看国产网址你懂的 | 97dyy在线观看手机版 | 国语高清精品一区二区三区 | 久久99精品久久久久子伦 | 国产综合网站 | 亚洲小视频在线观看 | 一本一本久久a久久精品综合麻豆 | 欧美亚洲日本国产综合网 | 国产老年人性视频 | 99久热在线精品视频观看 | 看全色黄大色大片免费久黄久 | 欧洲成人免费视频 | 国产99热在线观看 | 成人网18免费视频 | 美美女高清毛片视频黄的一免费 | 四虎在线永久免费视频网站 | 四虎影视在线观看永久地址 | 日b黄色 | 日本免费久久 | 尤物精品国产福利网站 | 停停色| 国产免费一区二区三区免费视频 | 欧美精品中文字幕手机免费视频 | 日本三级做a全过程在线观看 | 四虎影院久久久 | 久久综合九色综合77 | 好吊妞精品视频 | 日韩一区国产二区欧美三 | 日日夜夜国产 | 亚洲 欧美 日韩 在线 香蕉 | 四虎a| 99中文字幕| 免费看国产精品久久久久 | 国产精品视频第一区二区三区 | 天天干天天射综合网 | 欧美91精品久久久久网免费 | 久久青青草原精品影院 |