上一篇文章:FileUpload + FormView(或DetailsView)看似簡單,但不好做 #1--初學者的盲點
http://mis2000lab.pixnet.net/blog/post/34543529
程式的執行成果:
把 FormView的新增樣版(InsertItemTemplate),裡面加上 FileUpload控制項
希望「新增」一筆記錄的同時,也能順便「上傳」檔案
這個範例真的不難,
簡單的說,看過「上集」第十章,學會 .FindControl()方法即可
加上對於 FormView(DetailsView) + SqlDataSource夠熟練
願意「動手寫」一點程式
真的很快就搞定了。
Protected Sub FormView1_ItemInserting(sender As Object, e As FormViewInsertEventArgs) Handles FormView1.ItemInserting
'== 自己寫程式了,所以 .aspx檔(畫面)裡面的 SqlDataSource,請把 InsertCommand刪除。
SqlDataSource1.InsertCommand = "INSERT INTO [FileUpload_DB] ([FileUpload_time], [test_id], [FileUpload_FileName], [FileUpload_Memo], [FileUpload_User]) VALUES (@FileUpload_time, @test_id, @FileUpload_FileName, @FileUpload_Memo, @FileUpload_User)"
'== 參數的寫法,可以參考「搜尋引擎」那一章,範例 Search_Engine_4_SqlDataSource_Manual.aspx。
'== 這裡寫的比較簡單,但實務上,要小心資料隱碼攻擊(SQL Injection)。
Dim ca As Calendar = FormView1.FindControl("Calendar1")
SqlDataSource1.InsertParameters.Add("FileUpload_time", ca.SelectedDate)
Dim tb1 As TextBox = FormView1.FindControl("test_idTextBox")
SqlDataSource1.InsertParameters.Add("test_id", tb1.Text)
'==== 檔案上傳的程式,寫在這裡 ======================(start)==
Dim FL As FileUpload = FormView1.FindControl("FileUpload1")
'-- 註解:請看上集,第十八章,FileUpload 有完整範例
......抱歉!省略.........
SqlDataSource1.InsertParameters.Add("FileUpload_FileName", fileName) '== SqlDataSource的參數
'==== 檔案上傳的程式,寫在這裡 =======================(end)==
Dim tb2 As TextBox = FormView1.FindControl("FileUpload_MemoTextBox")
SqlDataSource1.InsertParameters.Add("FileUpload_Memo", tb2.Text)
Dim tb3 As TextBox = FormView1.FindControl("FileUpload_UserTextBox")
SqlDataSource1.InsertParameters.Add("FileUpload_User", tb3.Text)
End Sub
Protected Sub SqlDataSource1_Inserted(sender As Object, e As SqlDataSourceStatusEventArgs) Handles SqlDataSource1.Inserted
'== 資料新增成功以後 ....
If FormView1.CurrentMode = FormViewMode.Insert Then
FormView1.DefaultMode = FormViewMode.ReadOnly
End If
'== Select指令被我改過,請到 .aspx畫面去看一下。我做了反排序,讓剛剛新增的那一筆,秀到畫面上(給你確定:新增成功!)
Label1.Text &= "<h2>檔案上傳、新增一筆記錄,成功!!</h2>"
End Sub
其他的解法,任選其一來作:
(1). 保留HTML畫面中的 SqlDataSource與相關的新增指令(InsertCommand)
後置程式碼裡面, FormView1_ItemInserting事件
用 e.Values("欄位名稱") = 您剛剛上傳的檔名。
C# -- e.Values["欄位名稱"] = 您剛剛上傳的檔名;
(2). FileUpload,檔案上傳事先做好。
上傳成功以後,把上傳的「檔名」,傳入 FormView「新增樣版」裡面的 TextBox(設成唯讀,ReadOnly)
(3). 我另外做了一個 ADO.NET (DataReader)的寫法,不用 SqlDataSource
以上任選其一來完成
懂得越多、基礎越穩,解法就會源源不絕..........
留言列表