關於大型控制項,結合檔案上傳功能!!
還記得兩年前我還是 ASP.NET 的初學者時,我的老師 MIS2000 說:
之前有一位同學想要在大型控制項裡面放檔案上傳的功能,而且想要不寫程式的情況下,就要完成檔案上傳
其實這樣的功能,在當下我聽了之後,就知道這是不可能的
如今我寫這篇文章,是我發現到什麼可能性嗎?
嘿嘿嘿!!
其實不是喔,檔案上傳的功能其實真的是要寫程式的,而且檔案上傳功能其實用到的地方很多
所以我都把它寫成類別並包成DLL,日後的專案只要引用DLL就可以達到檔案上傳的功能,減少寫 CODE 的時間
之前只要遇到檔案上傳功能,如果同一個畫面還有文字要輸入時,我都會用以下兩種方式來處理
1.硬寫 CODE ,自己刻畫面,然後全部使用後置程式碼來把資料寫入資料庫與處理檔案上傳功能
2.先把要輸入的資料透過 SqlDataSource 來處理後,再跳到另一個畫面讓使用者挑選檔案上傳,當然檔案上傳的部分也是要寫後置程式碼來處理
第一種方法耗時,硬寫 CODE 花時間
第二種方法雖然程式寫的不多,但是使用者體驗不好,因為檔案上傳要跳畫面
所以就東想西想,就把兩個結起來了,透過簡單的 FindControl 就可以把兩個結合起來
以下已 DetailsView 的 新增 為例
一樣用大型控制項的畫面點選功能,很容易就可以把基本的文字資料完成新增功能
完成後,新增一個 TemplateField 的欄位,並放入檔案上傳的物件,程式碼如下
<asp:DetailsView ID="DetailsView1" runat="server" Width="650px" AutoGenerateRows="False" DataKeyNames="StuID" DataSourceID="SqlDataSource1StuInfo" DefaultMode="Insert" CssClass="manage_StuEdit_DetailsView1" OnItemInserted="DetailsView1_ItemInserted">
<Fields>
<asp:TemplateField HeaderText="主題" SortExpression="StuTopic">
<InsertItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("StuTopic") %>' Width="300px" CssClass="menage_StuEdit_DetailsView1_TextBox"></asp:TextBox>
</InsertItemTemplate>
<HeaderStyle Width="70px" />
</asp:TemplateField>
<asp:TemplateField HeaderText="學生姓名" SortExpression="StuName">
<InsertItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("StuName") %>' Width="70px" CssClass="menage_StuEdit_DetailsView1_TextBox"></asp:TextBox>
</InsertItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="備註" SortExpression="StuBak">
<InsertItemTemplate>
<asp:TextBox ID="TextBox3" runat="server" Height="50px" Text='<%# Bind("StuBak") %>' TextMode="MultiLine" Width="500px" CssClass="menage_StuEdit_DetailsView1_TextBox"></asp:TextBox>
</InsertItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="檔案上傳">
<EditItemTemplate>
<asp:FileUpload ID="FileUpload1" runat="server" />
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField ShowHeader="False">
<ItemTemplate>
<asp:Button ID="Button1" runat="server" CausesValidation="false" CommandName="Insert" Text="新增" CssClass="main_Default_GridView1_Button1" />
</ItemTemplate>
</asp:TemplateField>
</Fields>
</asp:DetailsView>
重點是
<asp:TemplateField HeaderText="檔案上傳">
<EditItemTemplate>
<asp:FileUpload ID="FileUpload1" runat="server" />
</EditItemTemplate>
</asp:TemplateField>
接下來就是後製程式碼的部分,只要把上傳檔案的功能放在 OnItemInserted 事件上,就可以了 程式碼如下:
protected void DetailsView1_ItemInserted(object sender, DetailsViewInsertedEventArgs e)
{
try
{
using (SqlConnection Conn = new SqlConnection(WebConfigurationManager.ConnectionStrings[WebConfigurationManager.AppSettings["DataBaseConn"]].ConnectionString))
{
Conn.Open();
FileUpload FL = (FileUpload)DetailsView1.FindControl("FileUpload1");
string[] FileName = null;
if (FL.HasFile)
{
string StuID = "";
SqlDataReader dr = null;
using (SqlCommand cmd = new SqlCommand("SELECT Top 1 * FROM StuInfo ORDER BY CreateDate DESC", Conn))
{
dr = cmd.ExecuteReader();
dr.Read();
StuID = dr["StuID"].ToString();
}
FileName = SICode.A201FileUpload(FL, "/upload/" + StuID + "/").Split(',');
try
{
int i = 0;
using (StreamReader SR = new StreamReader(Request.PhysicalApplicationPath + "\\upload\\" + StuID + "\\" + FileName[1]))
{
string Line;
while ((Line = SR.ReadLine()) != null)
{
i++;
if (i > 1)
{
string[] ReadLine_Array = Line.Split(',');
using (SqlCommand cmd = new SqlCommand("INSERT INTO StuData (StuID,Question,TimeStamp,PoorSignal,Attention,Meditation,Delta,Theta,LowAlpha,HighAlpha,LowBeta,HighBeta,LowGamma,MidGamma,AbsoluteAttention,AbsoluteMeditation,AbsoluteStress) VALUES(@StuID,@Question,@TimeStamp,@PoorSignal,@Attention,@Meditation,@Delta,@Theta,@LowAlpha,@HighAlpha,@LowBeta,@HighBeta,@LowGamma,@MidGamma,@AbsoluteAttention,@AbsoluteMeditation,@AbsoluteStress)", Conn))
{
cmd.Parameters.AddWithValue("@StuID", StuID);
cmd.Parameters.AddWithValue("@Question", ReadLine_Array[0]);
cmd.Parameters.AddWithValue("@TimeStamp", ReadLine_Array[1]);
cmd.Parameters.AddWithValue("@PoorSignal", ReadLine_Array[2]);
cmd.Parameters.AddWithValue("@Attention", ReadLine_Array[3]);
cmd.Parameters.AddWithValue("@Meditation", ReadLine_Array[4]);
cmd.Parameters.AddWithValue("@Delta", ReadLine_Array[5]);
cmd.Parameters.AddWithValue("@Theta", ReadLine_Array[6]);
cmd.Parameters.AddWithValue("@LowAlpha", ReadLine_Array[7]);
cmd.Parameters.AddWithValue("@HighAlpha", ReadLine_Array[8]);
cmd.Parameters.AddWithValue("@LowBeta", ReadLine_Array[9]);
cmd.Parameters.AddWithValue("@HighBeta", ReadLine_Array[10]);
cmd.Parameters.AddWithValue("@LowGamma", ReadLine_Array[11]);
cmd.Parameters.AddWithValue("@MidGamma", ReadLine_Array[12]);
cmd.Parameters.AddWithValue("@AbsoluteAttention", ReadLine_Array[13]);
cmd.Parameters.AddWithValue("@AbsoluteMeditation", ReadLine_Array[14]);
cmd.Parameters.AddWithValue("@AbsoluteStress", ReadLine_Array[15]);
cmd.ExecuteNonQuery();
}
}
}
}
}
catch (IOException ex)
{
SICode.A109MailErrorLogToSI(ex.ToString());
}
catch (NullReferenceException ex)
{
SICode.A109MailErrorLogToSI(ex.ToString());
}
catch (FormatException ex)
{
SICode.A109MailErrorLogToSI(ex.ToString());
}
}
Response.Redirect("../manage/StuManage.aspx");
}
}
catch (ThreadAbortException)
{
Thread.ResetAbort();
}
catch (Exception ex)
{
SICode.A109MailErrorLogToSI(ex.ToString());
}
}
我的後置看起來複雜一點,沒關西,那是因為我把上傳的檔案(CSV)讀出來,並寫入資料庫而已
重點是以下的程式碼
FileUpload FL = (FileUpload)DetailsView1.FindControl("FileUpload1");
只要正確的運用 FindControl 就可以抓到大型控制項裡面的物件,就可以加以運用了 編輯模式一樣可以用同樣的方法喔!! 以上是個人的淺見 如有更好的方法,再請各位指導喔!!
各位客官看看,ASP.NET 不難的碑
我是 ASP.NET 新手,程式有問題再請告知喔!!