數據表單向導的快速實現
2024-07-21 02:16:07
供稿:網友
 
asp.net的數據表單向導類似于windows應用程序。
介紹
自從vs.net為windows窗體提供了強大的數據表單向導工具之后,我一直在思考為什么不為asp.net提供相似的工具呢?
因為windows應用程序和asp.net應用程序使用的是相同的ado.net類,所以在asp.net中編寫這樣一個工具是有可能的。 
我們所關心的第一件重要的事情是它能在windows應用程序中良好而又穩定地使用dataset,而在web應用程序中就不是這樣了。最好的解決辦法就是使用datareader,因為它只能向前讀,所以它將是一件令人疲乏不堪的事情。
兩年前,我就已經開始寫這樣一個控件。這實在是一件工作量很大的事情,但是我認為它帶來的結果將是美好的。
背景
但是在我們工作結束的2個月(2002年),stephen walther的《unleashed asp.net》發表了。在這本書中,我發現了作者也寫了一個相同的控件,但是要比我寫的功能強的多。它有很多優點,甚至比windows應用程序的數據表單向導更好定制。它使用datareader而不是dataset,所以它是一個輕型的工具。
我想沒有必要再去發表討論這個控件的文章了,因為微軟一定會在新版vs.net (whidbey)中做出相同或更好的一個工具。但是在我看了asp.net 2.0(即whidbey)的新特性之后,我失望了因為微軟并沒有像我預想的那樣去做這樣一個工具。所以我看發表這樣一篇文章還是有用的。
這個控件本身是一些從 system.web.ui.webcontrols 類繼承過來的控件的集合,它可以分成兩個分集合:
1.              專門處理sql server的控件集合。
2.              處理任意數據庫引擎的oledb控件的集合。
我已經測試通過了sql模塊,一些bug能被克服實在是太棒了。但是關于oledb模塊并不順利,我在oracle 9i中進行了試驗,遺憾的是它并不能正常工作,因為在接受連接字符串時有一個bug。(我希望能盡快修補好)
使用代碼
我已經寫好了一個例子,它演示了如何使用這個控件,如何完全克服它的一些bug。
1.              打開vs.net,新建項目,選擇“asp.net web 應用程序”。
2.              在工具箱中點擊右鍵,選擇“添加/移除項”,轉到下載的工程文件夾下的 bin 目錄,然后選擇 superexpert.dataform.dll ,這樣就會把dataform的兩個控件集添加到工具箱中。正如你所看到的, oledb控件都是綠色的而sql控件都是紅色的。
3.              把sqldatapanel 控件放到頁面上,然后把你想要的所有控件(如前圖所見)也放上去。
4.              設置 sqldatapanel 的屬性,使它指向所請求的表,其他關鍵區域如下圖所示:
技巧:
不要在設計模式下設置連接字符串。我曾這么做但是它不能工作,所以最好是在頁面加載時進行設置。(我的連接字符串存放在 web.config 并指向 sql server中的northwind數據庫)
sqldatapanel1.connection = new _
  sqlconnection(system.configuration._
  configurationsettings.appsettings("connstr"))
5.把 sqldatanavigator 控件(它包含4個向導按鈕)放到頁面上,然后把它跟 sqldatapanel 控件聯系起來,代碼如下:
sqldatanavigator1.controltonavigate = me.sqldatapanel1
同樣,你應該把相同的字符串跟向導控件聯系起來,代碼如下:
sqldatanavigator1.connection = me.sqldatapanel1.connection
6.              把所有你要在這個表單中使用的控件放到頁面上去,注意,一定是要列出來的控件集中的控件。舉例來說,如果你想要在 textbox控件中顯示數據,你必須選擇 datatextbox 控件并把它放在你的 sqldatapanel 控件上。
7.              每個數據控件中有兩個屬性是需要設置的:
datafield: 保存綁定區域的名字
datatype: 保存綁定區域的數據類型
8.運行這個程序,你將看到你可以平穩而快速地瀏覽northwind數據庫中employees表中的數據。
提示:
如果你是直接從 stephen 的網站下載這個控件的,那你將看到一條評估信息,而你下載本文附加的那個控件將不會出現評估信息。
9.stephen的控件有“添加記錄”,“更新”和“刪除”幾個按鈕,但是我試了之后發現它們不起作用,所以你必須像處理常規按鈕那樣手動操作它們,這個例子將顯示成這樣: 
這是操作這個例子的所有源代碼[vb.net]:
private sub page_load(byval sender as system.object, _
         byval e as system.eventargs) handles mybase.load
 
    ' put user code to initialize the page here
    ' passing the data panel to the navigator coz it'll not
    ' work from design mode properties (bug)
 
    sqldatanavigator1.controltonavigate = me.sqldatapanel1
 
    ' also passing the connection string from web.config
    ' becoz passing it from the design mode will not work (bug)
 
   sqldatapanel1.connection = new _
      sqlconnection(system.configuration.configurationsettings.appsettings(_
                                                                 "connstr"))
 
    'and finally passing it to the navigator too.
    sqldatanavigator1.connection = me.sqldatapanel1.connection
end sub
 
'handling the add record btn
private sub dataaddbutton1_click(byval sender as system.object, _
        byval e as system.eventargs) handles dataaddbutton1.click
 
    dim insertstr as string = "insert into employees" & _ 
          " (lastname,firstname,title,city,country,homephone,notes) values('"_ 
          + me.lastname_txt.text + "','" + me.firstname_txt.text + _
          "','" + me.title_txt.text + "', '" + me.city_txt.text + _
          "','" + me.cntry_txt.text + "','" + me.homephone_txt.text + _
          "','" + me.notes_txt.text + "')"
 
    dim conn as new _
      sqlconnection(system.configuration.configurationsettings.appsettings(_
                                                                  "connstr"))
    dim cmd as new sqlcommand(insertstr, conn)
 
    try
      conn.open()
      cmd.executenonquery()
    finally
      conn.close()
    end try
end sub
'handling the delete btn
private sub delete_btn_click(byval sender as system.object, _
        byval e as system.eventargs) handles delete_btn.click
 
    dim delstr as string = _
       "delete from employees where employeeid='" + _
       me.empid_txt.text + "'"
 
    dim conn as new _
      sqlconnection(system.configuration.configurationsettings.appsettings(_
                                                                  "connstr"))
 
    dim cmd as new sqlcommand(delstr, conn)
 
    try
      conn.open()
      cmd.executenonquery()
    finally
      conn.close()
    end try
end sub
'handling the update btn
 
private sub dataupdatebutton1_click(byval sender as system.object, _
   byval e as system.eventargs) handles dataupdatebutton1.click
 
   dim updatestr as string = "update employees set lastname='" + _
                             me.lastname_txt.text + "',firstname='" + _
                             me.firstname_txt.text + "',title='" + _
                             me.title_txt.text + "',city='" + _
                             me.city_txt.text + "',country= '" + _
                             me.cntry_txt.text + "',homephone='" + _
                             me.homephone_txt.text + "',notes='" + _
                             me.notes_txt.text + "' where employeeid='" + _
                             me.empid_txt.text + "'"
 
    dim conn as new _
      sqlconnection(system.configuration.configurationsettings.appsettings(_
                                                                  "connstr"))
 
    dim cmd as new sqlcommand(updatestr, conn)
 
    try
      conn.open()
      cmd.executenonquery()
    finally
      conn.close()
    end try
end sub