關於大型控制項,結合檔案上傳功能!!

  • 401
  • 0

關於大型控制項,結合檔案上傳功能!!

還記得兩年前我還是 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 新手,程式有問題再請告知喔!!