2023年5月25日 星期四

V20302 – [資料顯示] – 全部資料顯示在同一頁, 以便[匯出Excel] - 全部勾選 - 匯出所有的資料

 目的: V20302 –[資料顯示]–全部資料顯示在同一頁, 顯示所有資料

           以便[匯出Excel] - 全部勾選 - 匯出所有的資料

處理說明:   1>所有資料筆數 : gridstore.data.length;
                    2>toolbar.Paging : 顯示資料更新,  




1>*.js
                           var gridstore = Ext.getCmp('grid_Single').store;
                            //console.log('2  gridstore: ', gridstore);
                            gridstore.getProxy().url = '../api/V20302API/getGridData_M?par_paging=false';
                            gridstore.getProxy().extraParams = np; //分頁OK,篩選條件OK
                            var Tmp_cnt = 0;
                            gridstore.on('load', function () {
                                console.log("onload  gridstore.data.length:", gridstore.data.length);
                                Ext.getCmp('grid_Single').store.pageSize = gridstore.data.length;
                                console.log("Ext.getCmp(grid_ptb): ", Ext.getCmp('grid_ptb'));
      console.log(" 0 Ext.getCmp(grid_ptb).afterPageText: ", Ext.getCmp('grid_ptb').afterPageText);        
                                Ext.getCmp('grid_ptb').updateInfo();            
                                // toolbar.Paging  顯示  頁,共1頁                    
                                Tmp_cnt = Tmp_cnt + 1;
                                if (Tmp_cnt<=1)
                                   Ext.getCmp('grid_ptb').moveLast();

                            })

2023年5月21日 星期日

V20302 –[匯出EXCEL]鈕 - 匯出勾選資料– Cookie - c# - js - JSON - 資料傳至後端

 目的: V20302 –[匯出EXCEL] 

處理說明: 一.前端(*.js)
                        1>將目前所選的資料s, 轉成 JSON字串, 當成 np 參數, 傳至後端
                        2>若要傳送檔案至前端, 1>>必需用 form.submit , 不可用 Ext.Ajax
                                                                  2>>standardSubmit: true, 

                   二.後端(*.cs)
                        1>將資料參數,轉成 Table

                           string Tmp_DataString1 = nvc["DataString1"]; //Tmp_DataString: 子畫面. JSON字串
                           DataTable dt1 = myfunc.JSON2dt(Tmp_DataString1);
                       2>讀取 SS_FILES 的 Template檔案 至 ws
                       3> ws 寫資料 , 存至檔案
                       4>將檔案傳送至前端  



1>*.js
 {
            xtype: 'button', text: '匯出EXCEL', id: 'XlsOutBtn',
            listeners: {
                click: function () {
                    //console.log(" 1 匯出EXCEL: ");
                    XlsOutBtn_click();
                }
            }
        },



//查詢 - 將目前所選的資料,匯出成報表
function XlsOutBtn_click() {
var Tmp_Grid = Ext.getCmp('grid_Single');
var cur_recs, cur_rec;
var Tmp_SAPNO, Tmp_PN, Tmp_QTY, Tmp_EOCND, Tmp_RMK;
var Tmp_data_JSON = ""; //將store資料轉成 JSON 的字串
var Tmp_sub_np = {};
let Tmp_DataAry1 = [];
var Tmp_Str = "";
cur_recs = Tmp_Grid.getView().selModel.getSelection();
//console.log("cur_recs:", cur_recs);
if (cur_recs.length == 0) {
mywarnalert("請先選擇要匯出 EXCEL 的資料");
return;
}

for (var i = 0; i < cur_recs.length; i++) {
cur_rec = cur_recs[i];
//console.log(Tmp_Str + "cur_rec:", cur_rec);
Tmp_DataAry1.push(cur_rec.data);
}

//console.log("Tmp_DataAry1:", Tmp_DataAry1);

// 將目前子畫面的資料(Table)轉成 JSON字串
let Tmp_DataString1 = JSON.stringify(Tmp_DataAry1);
//console.log("Tmp_DataString1:", Tmp_DataString1);

var np = {};
np = {
DataString1: Tmp_DataString1,
};

//Ext.Ajax.request({
Ext.getCmp('s_form').submit({
url: '../../api/V20302API/XlsOut',
method: 'POST',
async: false,
standardSubmit: true, //若要傳送檔案至前端, standardSubmit必需設為 true
params: np,
});

//顯示結果訊息..
var mask = new Ext.LoadMask(Ext.getBody(), {
msg: '處理中,請稍待...'
});

mask.show();//使用 mask 需手動呼叫show() 方法下
//若要傳送檔案到前端, 必需用 Cookie 判斷後端是否已完成
 //每1秒檢核一次,是否已完成, 若已完成,則不再檢核
        var timer = setInterval(function () {            
            var r = r_cookies('EX_DFile');
            //console.log("r_cookies=", r);
            if (!checkisnull(r)) {
                mysuccessalert(r);
                clearInterval(timer);
                mask.hide();
                timer = null;
            }
        }, 1000);  //1000ms = 1sec
    }  // end of  function LookBtn_click() {



2>*.cs
 //查詢 - 將所選的資料匯出至 xls  - 套表
        [HttpPost]
        public void XlsOut()
        {
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            // 1>將 SS_FILES.FBOLD 存成 Local檔案
            //取得目前子畫面的欄位值
            string Tmp_DataString1 = nvc["DataString1"];    //Tmp_DataString: 子畫面的資料. JSON字串   
            //將 table 字串轉成 DataTable
            //DataTable DataTable1 = (DataTable)JsonConvert.DeserializeObject(Tmp_DataString1, (typeof(DataTable)));
            DataTable dt1 = myfunc.JSON2dt(Tmp_DataString1);

            OracleConnection conn = new OracleConnection(DBService.ConnectionString(DBLINK));//
            OracleCommand cmd = new OracleCommand();
            //OracleDataAdapter adp = new OracleDataAdapter();
            //DataSet ds = new DataSet();
            //var response = Request.CreateResponse();

            conn.Open();
            conn.ClientInfo = User.Identity.Name;
            conn.ModuleName = BaseSYS + "_" + BaseMODID;
            conn.ActionName = ActionName;
            cmd.Connection = conn;
            string Tmp_Sql = "";
            string Tmp_Str = "";
            string Tmp_Str1 = "";
            string Tmp_RtnMsg;
            string Tmp_FName = "V20302_匯出報表.xlsx";      //套表的檔案名稱 , 
            string documentPath = HttpContext.Current.Server.MapPath("~") + "document\\";  // 取得實實的路徑            
            string pathFName = documentPath + Tmp_FName;
            //需要擷取大量資料時,DataReader 是很好的選擇,因為資料不會快取至記憶體。
            OracleDataReader reader;
            Workbook wk = null;
            MemoryStream mstream = new MemoryStream();            
            string FileName = "V20302_匯出報表_" + DateTime.Now.ToString("yyyyMMdd") + ".xlsx";
            string FileName1 = documentPath + FileName;
            HttpCookie MyCookie;
            try
            {
                wk = new Workbook();
                //1>將  SS_FILES. FBODY , 存至Local目錄.檔案                 
                if (File.Exists(pathFName))
                {
                    File.Delete(pathFName);
                }
                Tmp_Sql = " SELECT  FNAME,FBODY "
                                + " FROM     SS_FILES   "
                                + "   WHERE   1 = 1  "
                                + "  AND         FNAME = " + myfunc.AA(Tmp_FName);
                cmd.CommandText = Tmp_Sql;
                reader = cmd.ExecuteReader();
                byte[] file = null;
                //FileMode.OpenOrCreate: 開啟檔案若無檔案則新增
                //FileAccess.ReadWrite: 允許檔案讀取/寫入
                FileStream fs = File.Open(pathFName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                BinaryWriter bw = new BinaryWriter(fs);
                if (reader.HasRows)
                {
                    if (reader.Read())
                    {
                        file = (byte[])reader["FBODY"];
                        //fs.Write(file,0,50000);
                        bw.Write(file);
                        wk.LoadFromStream(fs);
                        bw.Close();
                        fs.Close();
                    }
                }

                //2 > 主機.Local檔案 XLS 讀入  FStream
                Worksheet ws = wk.Worksheets[0];//獲取第一個工作表

                //寫入欄位
                string Tmp_AMMNO, Tmp_RPNOAF, Tmp_MRPNOAF,Tmp_SAPNO_;
                string Tmp_TYPEAF, Tmp_PN_, Tmp_C_NM, Tmp_SEQOAF, Tmp_MB1A;
                string Tmp_RBTHAF, Tmp_OGONOAF, Tmp_NGONOAF, Tmp_WBSNO;
                //系統件單號, 資料來源, 數量 料號 機種 承修工場 工單類型 單況 單況說明
                string Tmp_FMNO, Tmp_DTSOR, Tmp_RQTYAF, Tmp_NSN, Tmp_EIAC_CUS;
                string Tmp_FACWC, Tmp_FRTP, Tmp_STATFM, Tmp_STATFM_;                   


                //每筆資料列印後, 不分頁列印下一筆
                for (var i = 0; i < dt1.Rows.Count; i++)
                {
                    Tmp_AMMNO = dt1.Rows[i]["AMMNO"].ToString();
                    Tmp_RPNOAF = dt1.Rows[i]["RPNOAF"].ToString();
                    Tmp_MRPNOAF = dt1.Rows[i]["MRPNOAF"].ToString();
                    Tmp_SAPNO_ = dt1.Rows[i]["SAPNO_"].ToString();
                    //string Tmp_TYPEAF, Tmp_PN_, Tmp_C_NM, Tmp_SEQOAF, Tmp_MB1A;
                    Tmp_TYPEAF = dt1.Rows[i]["TYPEAF"].ToString();                    
                    Tmp_PN_ = dt1.Rows[i]["PN_"].ToString();
                    Tmp_C_NM = dt1.Rows[i]["C_NM"].ToString();                    
                    Tmp_SEQOAF = dt1.Rows[i]["SEQOAF"].ToString();
                    Tmp_MB1A = dt1.Rows[i]["MB1A"].ToString();
                    //string Tmp_RBTHAF, Tmp_OGONOAF, Tmp_NGONOAF, Tmp_WBSNO;
                    Tmp_RBTHAF = dt1.Rows[i]["RBTHAF"].ToString();
                    Tmp_OGONOAF = dt1.Rows[i]["OGONOAF"].ToString();
                    Tmp_NGONOAF = dt1.Rows[i]["NGONOAF"].ToString();
                    Tmp_WBSNO = dt1.Rows[i]["WBSNO"].ToString();
                    //string Tmp_FMNO, Tmp_DTSOR, Tmp_RQTYAF, Tmp_NSN, Tmp_EIAC_CUS;
                    Tmp_FMNO = dt1.Rows[i]["FMNO"].ToString();
                    Tmp_DTSOR = dt1.Rows[i]["DTSOR"].ToString();
                    Tmp_RQTYAF = dt1.Rows[i]["RQTYAF"].ToString();
                    Tmp_NSN = dt1.Rows[i]["NSN"].ToString();
                    Tmp_EIAC_CUS = dt1.Rows[i]["EIAC_CUS"].ToString();
                    //string Tmp_FACWC, Tmp_FRTP, Tmp_STATFM, Tmp_STATFM_;                   
                    Tmp_FACWC = dt1.Rows[i]["FACWC"].ToString();
                    Tmp_FRTP = dt1.Rows[i]["FRTP"].ToString();
                    Tmp_STATFM = dt1.Rows[i]["STATFM"].ToString();
                    Tmp_STATFM_ = dt1.Rows[i]["STATFM_"].ToString();

                    //GetExcelPos(欄, 行) 以 0 開始, 
                    //string Tmp_AMMNO, Tmp_RPNOAF, Tmp_MRPNOAF, Tmp_SAPNO_;                    
                    ws.Range[myfunc.GetExcelPos(0, i + 1)].Text = Tmp_AMMNO;
                    ws.Range[myfunc.GetExcelPos(1, i + 1)].Text = Tmp_RPNOAF;
                    ws.Range[myfunc.GetExcelPos(2, i + 1)].Text = Tmp_MRPNOAF;
                    ws.Range[myfunc.GetExcelPos(3, i + 1)].Text = Tmp_SAPNO_;
                    //string Tmp_TYPEAF, Tmp_PN_, Tmp_C_NM, Tmp_SEQOAF, Tmp_MB1A;                    
                    ws.Range[myfunc.GetExcelPos(4, i + 1)].Text = Tmp_TYPEAF;
                    ws.Range[myfunc.GetExcelPos(5, i + 1)].Text = Tmp_PN_;
                    ws.Range[myfunc.GetExcelPos(6, i + 1)].Text = Tmp_C_NM;
                    ws.Range[myfunc.GetExcelPos(7, i + 1)].Text = Tmp_SEQOAF;
                    ws.Range[myfunc.GetExcelPos(8, i + 1)].Text = Tmp_MB1A;
                    //string Tmp_RBTHAF, Tmp_OGONOAF, Tmp_NGONOAF, Tmp_WBSNO;
                    ws.Range[myfunc.GetExcelPos(9, i + 1)].Text = Tmp_RBTHAF;
                    ws.Range[myfunc.GetExcelPos(10, i + 1)].Text = Tmp_OGONOAF;
                    ws.Range[myfunc.GetExcelPos(11, i + 1)].Text = Tmp_NGONOAF;
                    ws.Range[myfunc.GetExcelPos(12, i + 1)].Text = Tmp_WBSNO;
                    //string Tmp_FMNO, Tmp_DTSOR, Tmp_RQTYAF, Tmp_NSN, Tmp_EIAC_CUS;                    
                    ws.Range[myfunc.GetExcelPos(13, i + 1)].Text = Tmp_FMNO;
                    ws.Range[myfunc.GetExcelPos(14, i + 1)].Text = Tmp_DTSOR;
                    ws.Range[myfunc.GetExcelPos(15, i + 1)].Text = Tmp_RQTYAF;
                    ws.Range[myfunc.GetExcelPos(16, i + 1)].Text = Tmp_NSN;
                    ws.Range[myfunc.GetExcelPos(17, i + 1)].Text = Tmp_EIAC_CUS;
                    //string Tmp_FACWC, Tmp_FRTP, Tmp_STATFM, Tmp_STATFM_;
                    ws.Range[myfunc.GetExcelPos(18, i + 1)].Text = Tmp_FACWC;
                    ws.Range[myfunc.GetExcelPos(19, i + 1)].Text = Tmp_FRTP;
                    ws.Range[myfunc.GetExcelPos(20, i + 1)].Text = Tmp_STATFM;
                    ws.Range[myfunc.GetExcelPos(21, i + 1)].Text = Tmp_STATFM_;                    
                }

                wk.SaveToStream(mstream, FileFormat.Version2007);
                wk.SaveToFile(FileName1, FileFormat.Version2007);
                //wk.SaveToStream(mstream, FileFormat.Version2013);
                //wk.SaveToFile(FileName1, FileFormat.Version2013);                
            }
            catch (Exception e)
            {
                var Tmp_ErrMsg = e.Message;
                //匯出檔產生失敗
                Tmp_Str = "產生匯出檔案失敗<br>"
                                + Tmp_ErrMsg;
                MyCookie = new HttpCookie("EX_DFile", HttpUtility.UrlEncode(Tmp_Str));
                HttpContext.Current.Response.Cookies.Add(MyCookie);
                //HttpContext.Current.Server.ClearError();                
                HttpContext.Current.ApplicationInstance.CompleteRequest();
                return;
            }
            finally
            {
                wk.Dispose();
                conn.Close();
            }

            HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + HttpUtility.UrlEncode((string)FileName, System.Text.Encoding.UTF8) + "\"");
            HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
            HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            HttpContext.Current.Response.BinaryWrite(mstream.ToArray());
            //匯出檔產生完成
            Tmp_Str = "產生匯出檔案成功<br>"
                            + "(" + FileName + ")<br>";
            MyCookie = new HttpCookie("EX_DFile", HttpUtility.UrlEncode(Tmp_Str));
            HttpContext.Current.Response.Cookies.Add(MyCookie);
            HttpContext.Current.Response.End();
        }  // end of public void DoPRNLIST()

V20302 – 不允許切換至[編輯]頁 – tabChange – setActiveTab()

 目的: V20302 – 不允許切換至[編輯] – tabChange – setActiveTab()

處理說明:  1>event : tabChange  - 判斷條件是否符合
                   2>若不符合,則不允許切換 tab 


1>*.js
//若 tabchange 時, 若未選擇資料, 則顯示訊息, 不允許切換至[編輯]頁
TMSingleViewEdit.on('tabchange', function (tabPanel, tab) {
if (tab.id == 'tab1') {
var cur_recs = Ext.getCmp('grid_Single').getSelectionModel().getSelection();
if (cur_recs.length == 0) {
var Tmp_Str = '請先選擇要瀏覽明細的資料!!';
mywarnalert(Tmp_Str);
Ext.getCmp('TMSingleViewEdit').setActiveTab('tab2');  //停留在[瀏覽]頁
//TMSingleViewEdit.setActiveTab(tab2);
//Ext.getCmp('TMSingleViewEdit').activeTab = 1; 
}
}
}); // end of tabchange


2023年5月19日 星期五

V20302 –Cookie – 如何判斷後端資料已更新完成, 才出現子畫面 -2 - settrue , waittrue - Cookie

 目的: V20302 – [確認除帳] – 如何判斷後端資料已更新完成, 才出現子畫面 -2 
           利用 myfunc.js 的  settrue , waittrue  - 設定Cookie 欄位值 & 取得Cookie欄位

處理說明: 1>當 store.on('load' 時, settrue(par_key) - 設定Cookie 為 true
                  2>waittrue(par_key, AddItem) - 直到 Cookie 為 true 時,才執行函式

1>*.js
    Ext.getCmp('sub1_Grid2').store.getProxy().url = '../api/V20302BAPI/getsubData2';
    Ext.getCmp('sub1_Grid2').store.getProxy().extraParams = np; //分頁OK,篩選條件OK    
    Ext.getCmp('sub1_Grid2').store.load();           
    
    //將 CSM_AF@TLS_245 的專案承辦人(以@分隔人員編號) 加入 副本.人員 [姓名][Notes_Email]
    Ext.getCmp('sub1_Grid2').store.on('load', function (me, records, successful, operation, eOpts) {        
        settrue("sub1_Grid2");
    }
    );

    waittrue("sub1_Grid2", AddItem);
    function AddItem() {
        Add_sub1_Grid2(par_EMPLYIDnot6);        
        Ext.getCmp('sub1_Grid2').getView().refresh();
    }
    



2>myfunc.js  -->   settrue()    waittrue()
/*
//函式名稱 : settrue  
傳入參數: par_key: string
設定 Cookie(par_key) 為 true 時
 */
function settrue(par_key, call_func) {
    Ext.util.Cookies.set(par_key,true);
}

/*
//函式名稱 : waittrue  
   傳入參數 : par_key : string
   若 Cookie(par_key) 為 true 時,才執行函式 call_func
*/
function waittrue(par_key, call_func) {
    console.log("par_key:", par_key);
    var timer = setInterval(function () {
        //var Tmp_loaded = decodeURIComponent(Ext.util.Cookies.get(par_key));
        var Tmp_loaded = Ext.util.Cookies.get(par_key);
        if (Tmp_loaded) {
            Ext.util.Cookies.clear(par_key);
            clearInterval(timer);  //不再重覆執行
            call_func();
            return;
        }
    }, 1000);
    };       // end ot waittrue()
    

2023年5月18日 星期四

V20302 – Cookie – 如何判斷後端資料已更新完成, 才出現子畫面 - timer - setInterval -等待時間

目的: V20302 – [確認除帳] – 更新後端資料後,才顯示子畫面
           --> 如何判斷後端資料已更新完成, 才出現子畫面
           --> 利用 Cookies(“finished”) 有值, 表示後端已執行完成

處理說明: 1>利用 Cookie 才判斷後端資料庫是否已更新完成, 以便往下繼續執行
                        var r = r_cookies('DoRemove_finished');
                        if (!checkisnull(r)) {

                  2>顯示訊息,使用者回應後才往下執行
                       var Tmp_Msg = "確認勾選的資料已正確, 並進行除帳作業嗎?";
                       Ext.Msg.confirm("確認", Tmp_Msg, DoRemove);
                       if (id == "no")
                          { return; }




1>*.js
Ext.getCmp('s_form').submit({
                method: "POST",
                url: '../../api/V20302API/DoRemove',  //更新資料庫單況
                standardSubmit: true,
                params: np,
                async: false,
            });  //end of Ext.Ajax.Request                    
                var mask = new Ext.LoadMask(Ext.getBody(), {
                    msg: '確認除帳處理中, 請稍待...'
                });
            mask.show();//使用 mask 需手動呼叫show() 方法下        
            //每隔 1秒後 , 執行 function , 檢核是否已完成(Cookie有值), 
            //                 至到 clearInterval(timer);  //不再重覆執行
                var timer = setInterval(function () {                                        
                    //若資料庫已更新完成, 則 Email 委約==6  &  Email 委約<>6
                    var r = r_cookies('DoRemove_finished');
                    if (!checkisnull(r)) {
                        is_Ok = false;                        
                        mask.hide();
                        clearInterval(timer);  //不再重覆執行
                        var Tmp_r = r.split(';');
                        var Tmp_cnt6 = Number(Tmp_r[1]);
                        var Tmp_cntnot6 = Number(Tmp_r[2]);
                        //取得 副本. [員工編號] , 以 @分隔
                        var Tmp_EMPLYIDnot6 = Tmp_r[3];
                        //console.log(" Tmp_cnt6 :", Tmp_cnt6);
                        //console.log(" Tmp_cntnot6 :", Tmp_cntnot6);
                        if (Tmp_cnt6 > 0) {
                           // console.log(" ShowEmail6() ");
                            ShowEmail6();
                        }                            
                        if (Tmp_cntnot6 > 0) {
                            //console.log(" ShowEmailnot6() ");
                            ShowEmailnot6(Tmp_EMPLYIDnot6);
                        }
                    }
                    //顯示 [挑選Email收件人]子畫面
                }, 1000)  // end of timer            
        };  // end of DoRemove


V20302B - 開啟子畫面時, 加入副本人員,但未顯示在畫面 - load() ,store

 目的: V20302B – 開啟子畫面時, 加入副本人員,但未顯示在畫面

處理說明:  1>開啟子畫面時, sub1_Grid2.store 會重新 load()
                   2>[副本人員]加入資料時, sub1_Grid2.store 尚未載入完成  - store load 尚未完成       
                   3>sub1_Grid2.store 載入完成時, 會覆蓋原本的 [副本人員]加入資料
                       --> 以致畫面上未加入資料


1>*.js

function ShowEmailnot6(par_EMPLYIDnot6) {
    Ext.getCmp('sub1_Grid2').store.getProxy().url = '../api/V20302BAPI/getsubData2';
    Ext.getCmp('sub1_Grid2').store.getProxy().extraParams = np; //分頁OK,篩選條件OK    
    Ext.getCmp('sub1_Grid2').store.load();                                                
    //將 CSM_AF@TLS_245 的專案承辦人(以@分隔人員編號) 加入 副本.人員 [姓名][Notes_Email]
    Add_sub1_Grid2(par_EMPLYIDnot6);
    Ext.getCmp('sub1_Grid2').getView().refresh();
   
}

--> store.load();
      Add_sub1_Grid2(par_EMPLYIDnot6);   //store尚未執行完成, 就 加入資料
      //等 store.load() 完成, sub1_Grid2原本加入的資料, 又被清空, 所以畫面無資料

-->改成 load 完成後,再加入資料即可
    store.on('load',function(){
        Add_sub1_Grid2(par_EMPLYIDnot6);
        Ext.getCmp('sub1_Grid2').getView().refresh();
   
    }

2023年5月17日 星期三

V20302A - 畫面 & Email 的換行處理
\r\n

 目的: 畫面 &  Email 的換行處理

處理說明:  1>前端畫面 : xtype: "textareafield" 欄位 ,   Tmp_content=Tmp_content +"\r\n" ;
                                           xtype: "label" 欄位 ,   Tmp_content=Tmp_content +"<br>" ;
                   2>Email內容: 
                       string  Tmp_content = nvc["sub_content"];  //    \r\n  --> 到後端只剩下\n
                       Tmp_content = Tmp_content.Replace("\n", "<br>");
                       sendMail(Tmp_Subject, Tmp_content, ChkMail);


1>*.js
      var Tmp_sub_content6 = "已經接收器材:\r\n"
                                            + r_V20302_content6 + "\r\n"
                                            + "請至 AMM系統 V20304: 拆檢/測試結果登錄做後續處理。\r\n";  
      Ext.getCmp("sub_Subject").setValue(Tmp_sub_Subjectnot6);

2>*.cs
       MailMessage ChkMail = new MailMessage();
      string  Tmp_Subject = nvc["sub_Subject"];
      string  Tmp_content = nvc["sub_content"];
      Tmp_content = Tmp_content.Replace("\n", "<br>");  // Email 必需以  <br> 換行
     string mail_from = "tlsapp@ms.aidc.com.tw";
     ChkMail.From = new MailAddress(mail_from, "AMM系統", System.Text.Encoding.UTF8);
     sendMail(Tmp_Subject, Tmp_content, ChkMail);







PS: 換行處理

1. 使用【+】符號 連接符號
string strSQL= "SELECT * FROM Flight_Schedule AS F"
                        + " INNER JOIN System_Code AS S"
                        + " ON F.Formno = c.Code_Desc1"
                        + " ORDER BY F.Formno";
                 
2.使用【@】符號 連接符號
string strSQL= @"SELECT * FROM Flight_Schedule AS F
                                INNER JOIN System_Code AS S
                                ON F.Formno = c.Code_Desc1
                               ORDER BY F.Formno"; 
 
3>標籤(Label)要換行"<br>"
Ex︰
lb_other.Text = "編號:" + lb_sno.Text + "<br>"
                        + "姓名:" + Txt_Name + "<br>"
                        + "電話:" + Txt_Tel ;
 
4>文字盒(TextBox)要換行"\r\n"
Ex︰
textBox1.Text = "編號:" + id + "\r\n"
                         + "姓名" + Name +"\r\n"
                         + "電話" + Tel;