2013年8月29日 星期四

單車單人帶單眼環半島DAY1_2013/4/11(四)


今日預定行程:枋寮火車站->台東太麻里山采家民宿,全程103公里。
實際行程:枋寮火車站->台東金崙美之濱民宿,全程84.97公里,騎乘時間6小時50分。

出發前一天加班與整理裝備,躺在床上已經凌晨3點了囧,
坐小黃(單車已裝進攜車袋)到板橋高鐵搭上7:08往高雄的車後,心想可以補個眠了XD,沒想到桃園站上來一對夫婦,男的台灣人,女的外國人,重點是他們的可愛混血兒一直在哭囧,小嬰兒真是令人又愛又恨呀~哈。

P.S. 單車上高鐵需攜車袋(黑塑膠袋好像也行),先跟售票員要求劃3排椅靠門邊的位置(給我8車20A)。


9:00整到了新左營,10分鐘後台鐵就要發車了,還好下車廂就有電梯,跟一堆人擠進去,順利的搭上往枋寮的莒光號,心情就變得很輕鬆,因為不用背著14公斤的單車加行李?公斤了囧



P.S. 台鐵車廂比較窄,車袋暫放出入口有點囧,建議找加掛貨車廂的列車。

10:42分抵達枋寮後,趕緊組裝單車,

敲敲打打(誤)了半小時終於要出發啦~照片請路過大哥拍的,以為我要到墾丁,我說要到台東,他愣了一下說加油XD。



終於出發啦~興奮的我,先停小7買卡打車,再停小7吃涼麵,反正不用花自己錢,心想小7真的旅人的好朋友,偏偏決定離開PIC了QQ,路上還接到家裡問狀況跟同事問程式的電話囧,不過有美景心情總是特別開闊,隨看隨停隨拍。


因此入南迴時已經快14:00了(我還不知道時間太晚了,果然新手又傻又天真),一開始還遇到落山風,才意會到網路上說單車最怕逆風跟上坡是啥意思,哈~



入南迴不到半小時,先拍了離太麻里51公里的標示,還拍了放山雞,此時路況都不錯。 
大概是過了雙流後吧,感覺不太一樣了(因此這段沒拍照了XD),路變小了但遊覽車跟砂石車變多了(
遇前方有右彎時先等大車過),此時也遇到熱情的民眾替我加油~有副駕駛side打開車窗的女聲(女生?)、部落的原住民捧友們與騎機車的年輕人,不得不說,身體再疲憊,聽到加油聲,真的會有一股力量湧出來~
       
一直爬坡,帶的水也快喝完了,幸好途中經過一派出所(鐵馬驛站),進去跟警員打個招呼裝滿水,順便詢問還有多久到南迴最高點,警察大人說快到了,剩不到5公里,新手的我OS: 那應該很快冏,接著警察大人建議我晚上可以睡大武或金崙,小弟我回說,民宿訂在太麻里,應該可以啦~ P.S.此時下午16點忘記幾分...

再上路後開始遇到環島車友(對向),第一次看到總是超興奮,看到對方舉起大拇指後,馬上有樣學樣當下回饋,看到車友在滑下坡了,也激起我的鬥志。
但沒想到離壽卡的短短幾公里這麼難騎,幾乎是騎幾百公尺就停下來休息QQ,而且開始下雨了冏,有些路段四周都沒車,真的有點淒涼XD,就在16:56分終於...
看到這令人動容的景象QQ,旁邊199縣道的休息站此時有3個車友在休息,但我只想一股作氣下到尚武那休息XD, 下坡路段真的有夠爽的~之前沒滑過這麼陡的,時速維持在
40內,途中也有遇到對向車友,此時對方埋頭努力中,我大聲跟他說加油XD,大概半小時抵達小7^0^。
P.S. 以前騎機車走南迴時,都會注意到台9的444公里處,現在開了家小7,有種滄海桑田之感XD

在小7吃點東西(包子跟茶葉蛋,印象中沒吃過小7包子...不好吃)稍作休息後,將近18:00往北走~


當時心裡想說說不到會用到,隨手一拍的結果,竟成我當晚的落腳處冏。



離太平洋好近~也是第一次騎南迴到台東,很難用言語形容的感覺...很感動

後來騎到大武市區天已全黑,當下有閃過今晚睡這的念頭,不過被莫名的自信/自尊心給矇蔽了XD,沒想到接下來這段路成了我旅途難忘的回憶QQ

現在的我回想起來,還會起一絲絲雞皮疙瘩冏,過了大武後的南迴公路完全沒有路燈,記得有一段離大平洋很近,右手邊的海浪聲近在咫尺,海水還飄到我臉上冏(當時沒下雨),路上偶爾有汽車經過,但大部分的時間只有我一個隱身在沒有月光的黑夜QQ,汽車接近時都特別打遠燈,離我遠遠的超過去(我有配備LED前後燈),加上是山路,上上下下根本騎不快,終於在20:00初看到一家全家,真的是黑暗的明燈,沙漠的綠洲呀XD,在這裡吃個布丁跟八寶粥,還在FB po文,此時距民宿28公里,距金崙10公里(店裡有標示),看著店裡的顧客都是開車來的,只有傻子我騎單車QQ。
再次上路約20:40多,這段右手邊都是樹,心裡也不敢亂想只能盡力騎,當下有點後悔好好的家裡那麼舒服不待,沒事幹麼跑來單車環島冏,還有想起古小姐曾叫我從大武火車站騎的建議,不過木已成舟,還好一路平安的在21:20多分抵達金崙小7,馬上查並問了幾家民宿,看到美之濱有車友住過(單車可放室內),且老闆開價500元符合預算,才決定放棄原先預訂的山采家民宿(200元訂金飛了QQ),到民宿登記後,老闆得知我獨自摸黑騎大武市區後到金崙這段15公里的山路,跟我說以後別再摸黑騎那段,因為....(消音),他說如果是他子女這樣騎,他會心酸冏,然後叫我趕快去休息,後來弄到12點才睡覺XD。
 

 




2013年8月27日 星期二

[C#] Form1的標題列如何動態render


.xxx.aspx.cs
this.Text = 值

參考資料:
http://zhidao.baidu.com/question/570402718.html

[ASP.NET] DropDownList常用語法紀錄

1. 資料繫結
xxx.aspx.cs
ddlTest.DataSource = 資料來源;
ddlTest.DataTextField = 繫結欄位Text字串;
ddlTest.DataValueField = 繫結欄位Value字串;
ddtTest.Text = 指定顯示Value;

//若繫結欄位為DataTable的Date欄位,要去除上午12:00:00
for (int i = 0; i < ddlTest.Items.Count; i++)
{
    ddlTest.Items[i].Text = Convert.ToDateTime(ddlTest.Items[i].Text).ToString("yyyy/MM//dd");
    ddlTest.Items[i].Value = Convert.ToDateTime(ddlTest.Items[i].Value).ToString("yyyy/MM//dd");
}

2. 取得選取項目文字與值
xxx.aspx
<asp:DropDownList ID="ddlTest" runat="server">

xx.aspx.cs
string strText = ddlTest.SelectedItem.Text; //取得選擇的Text
string strValue = ddlTest.SelectedValue;//取得選擇的Value


3.1 下拉選單預設先顯示「請選擇」項目,再出現繫結的資料。
有下列方法,可搭配if (ddlTest.SelectedIndex > 0)。:
3.1.1
xxx.aspx.cs
 ListItem item = new ListItem();
 item.Text = "請選擇";
 item.Value = "0";
 item.Selected = true;
 ...
 this.ddlTest.DataBind();
 this.ddlTest.Items.Add(item);

 ...
 this.ddlTest.DataBind();
 this.ddlTest.Items.Insert(0, "請選擇"或item));

3.1.2.
//xxx.aspx 繫結靜態項目
<asp:DropDownList ID="ddlTest" runat="server"  AppendDataBoundItems="True">
<asp:ListItem Value="0"  Text="請選擇"></asp:ListItem>
</asp:DropDownList>

3.2 清空已繫結項目 (使用兩個DropDownList做連動,第二個DropDownList的AppendDataBoundItems屬性設成 true,導致Item重複繫結 )
ddlTest.Items.Clear();
會連靜態繫結項目都清空,可以搭配ddlTest.Items.Insert(index, item)或ddlTest.Items.Add(item)來重新繫結。


4. ListItem Text繫結資源檔
xxx.aspx
<asp:DropDownList ID="ddlTest" runat="server">
        <asp:ListItem Value="ID" Text="<%$ Resources:PageResource, ID %>"></asp:ListItem>
        <asp:ListItem Value="Name" Text="<%$ Resources:PageResource, Name %>"></asp:ListItem>
</asp:DropDownList>

to be continued...

2013年8月26日 星期一

[ASP.NET] 下載PDF檔案

 private void DownloadFile(string strFile_Path)
 {
        string strFilePath = Server.MapPath(strFile_Path);

        if (strFilePath.Split('\\').Length != 0)
        {
            string strFileName = strFilePath.Split('\\')[strFilePath.Split('\\').Length - 1];

            //中文檔名作轉換
            //strFileName = HttpUtility.UrlEncode(strFileName, System.Text.Encoding.UTF8);

            FileStream fs = new FileStream(strFilePath, FileMode.Open);
            Byte[] byBuf = new Byte[fs.Length];

            fs.Read(byBuf, 0, Convert.ToInt32(fs.Length));
            fs.Close();
            fs.Dispose();

            Response.Clear();
            Response.ClearHeaders();
            Response.Buffer = true;
            //轉換文字檔編碼格式用,但本次輸出無文字檔,故註解此段
            //Response.ContentEncoding = parEncoding;
            Response.AddHeader("content-disposition", "attachment; filename=" + strFileName);

            Response.ContentType = "application/octet-stream";
            Response.BinaryWrite(byBuf);
            Response.End();
        }
 }

參考資料:
http://gogo1119.pixnet.net/blog/post/26900755-%5Basp.net%5D-%E7%84%A1%E7%B6%B2%E5%9D%80%E7%9A%84%E6%AA%94%E6%A1%88%E4%B8%8B%E8%BC%89

[C#] 發送內嵌多個圖片的Mail

public void SendMail()
{
            Encoding encode = Encoding.GetEncoding("UTF-8");
            MailMessage myMail = new MailMessage();

            myMail.From = new MailAddress("admin@test.com", string.Empty, encode);
            myMail.To.Add("a@test.com, b@test.com");
            myMail.Subject = "Test";
            myMail.SubjectEncoding = encode;
            myMail.Body = "<img src=\"test1.jpg\" /><img src=\"test2.jpg\" />";
            myMail.BodyEncoding = encode;

            //需啟用html格式才可內嵌圖片
            myMail.IsBodyHtml = true;

            myMail.Attachments.Add(GetAttachment("test1.jpg", encode));
            myMail.Attachments.Add(GetAttachment("test2.jpg", encode));

            SmtpClient smtp = new SmtpClient("localhost");

            try
            {
                smtp.Send(myMail);
                MessageBox.Show(DateTime.Now.ToString() + " 寄信成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(DateTime.Now.ToString() + " 寄信失敗" + ex.ToString());
            }
}

 private Attachment GetAttachment(string strFileName, Encoding encode)
 {
            //設定圖片路徑
            string strFilePath = @"C:\" + strFileName;
            Attachment attachment = new Attachment(strFilePath);
            attachment.Name = strFileName;
            attachment.NameEncoding = encode;
            attachment.TransferEncoding = TransferEncoding.Base64;

            // 設定附件為內嵌
            attachment.ContentDisposition.Inline = true;
            attachment.ContentDisposition.DispositionType = "inline";

            return attachment;
 }

參考資料:
http://blog.miniasp.com/post/2008/02/06/How-to-send-Email-with-embedded-picture-image.aspx
http://www.dotblogs.com.tw/sam19820611/archive/2009/09/09/10509.aspx

2013年8月20日 星期二

[ASP.NET] 使用showModalDialog開啟子視窗輸入資料後,再進行母視窗動作。

說明:點選GridView內的LinkButtion下載檔案時,需在子視窗TextBox輸入原因才可回母視窗動作。
做法:使用Session來判斷子視窗TextBox是否有值。

//Son.aspx
<form id="form1" runat="server">
    <div>
        <asp:HiddenField ID="hidFileID" runat="server" />
        <asp:TextBox ID="txtReason" runat="server"></asp:TextBox>
        <asp:Button ID="btnSave" runat="server" Text="儲存" onclick="btnSave_Click" />
    </div>
</form>

//Son.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
    Session["Reason"] = null;
}

protected void btnSave_Click(object sender, EventArgs e)
{
       bool blReturn = false;
       if (!string.IsNullorEmpty(txtReason.Text))
       {
           if (!string.IsNullorEmpty(hidFileID.Value))
           {
               blReturn = 呼叫儲存資料method;
               if (!blReturn)
               {
                   //showMsg("error");
               }
               else
               {
                   Session["Reason"] = txtReason.Text;
                   //儲存原因後關閉子視窗
                   Response.Write("<script>window.close();</script>");
               }
           }
       }
}

Parent.aspx
<asp:BoundField DataField="File_ID" HeaderText="檔案代碼" />
<asp:BoundField DataField="File_Path" HeaderText="檔案路徑"  />
<asp:TemplateField HeaderText="下載">
                <ItemTemplate>
                    <asp:LinkButton ID="lbtnDownload" runat="server" OnCommand="FileDownload" CommandArgument='<%# Eval("File_Path") %>'>
                </ItemTemplate>
            </asp:TemplateField>

Parent.aspx.cs
protected void FileDownload(Object sender, CommandEventArgs e)
{
    string strFile_Path = e.CommandArgument.ToString();
    if (Session["Reason"] == null || Session["Reason"].ToString() == "")
    {
        //showMsg("無輸入原因");
        return;
    }
    else
    {
        //下載檔案
    }
}

參考資料:
http://www.programmer-club.com.tw/ShowSameTitleN/aspdotnet/6117.html

2013年8月19日 星期一

[ASP.NET] 點選GridView內LinkButton透過showModalDialog開啟並傳值給子視窗

說明:點選GridView內LinkButton後,使用JavaScript的window.showModalDialog開啟並傳值到子視窗。使用showModalDialog是因為可凍結母視窗。

作法:
Parent.aspx
<asp:BoundField DataField="File_ID" HeaderText="檔案代碼" />
<asp:BoundField DataField="File_Path" HeaderText="檔案路徑"  />
<asp:TemplateField HeaderText="下載">
                <ItemTemplate>
                    <asp:LinkButton ID="lbtnDownload" runat="server" OnCommand="FileDownload" CommandArgument='<%# Eval("File_Path") %>'>
                </ItemTemplate>
            </asp:TemplateField>

//Parent.aspx.cs
 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
 {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            //使用FindControl找到GridView控制項內的LinkButton控制項
            LinkButton lbtnDownload = (LinkButton)e.Row.FindControl("lbtnDownload");

            string strFile_ID = e.Row.Cells[0].Text;
            lbtnDownload.OnClientClick = "javascript:window.showModalDialog(Child.aspx?File_ID=" + strFile_ID + "', '', 'resizable:no;status:no;scroll:no;dialogHeight:80px;dialogWidth:200px;')";
        }
 }

//Child.aspx
<head runat="server">
    //目標為子視窗自身
    <base target="_self">
</head>
...
<asp:HiddenField ID="hidFileID" runat="server" />

//Child.aspx.cs
 protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.QueryString["File_ID"] != null)
        {
            hidFileID.Value = Request.QueryString["File_ID"];
        }
    }

參考資料:
http://toyo0103.blogspot.tw/2012/10/showmodaldialog.html

2013年8月15日 星期四

[ASP.NET] 判斷表單輸入字串是否為數字

1. 以C#語法建立一靜態method判斷字串是否為浮點數值,是則return true。

static bool IsNumeric(object Expression)
{
    bool blIsNumeric = false;
    double dNum = 0;

    blIsNumeric = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.InvariantInfo, out dNum);

    return blIsNumeric;
}

資料來源:
http://support.microsoft.com/kb/329488/zh-tw


2. 使用ASP.NET的 RegularExpressionValidator控制項,在ValidationExpression屬性設定:
整數:^[0-9]*$或^[\d]*$
整數或小數:^[0-9]+\.{0,1}[0-9]*$或^[0-9]{1,}\.{0,1}[0-9]*$或^[\d]+\.?[\d]*$
至少2碼文數字:^[\w]{2, }$


參考資料:
http://jiannrong.blogspot.tw/2009/06/regularexpressionvalidatovalidationexpr.html
http://www.dotblogs.com.tw/wesley0917/archive/2010/12/16/20153.aspx


3. 使用JavaScript的isNaN(x),x為DOM的value




to be continued..



2013年8月8日 星期四

[ASP.NET] 無法修改 Controls 集合,因為控制項包含程式碼區塊 (例如 <% ... %>)。

說明:使用ASP.NET AJAX Control Toolkit控制項,加上有使用MasterPage的關係,
有用ResolveUrl來找js的絕對路徑,所以頁面有<%... %>,
(<script type="text/javascript" src='<%=ResolveUrl("~/js/xxx.js") %>'></script>)
因此出現該錯誤。

解決方式:
將<script type="text/javascript" src='<%=ResolveUrl("~/js/xxx.js") %>'></script>移出<head></head>,個人是放在</html>後(適用不是一開始就要執行的javascript)。

2013年8月7日 星期三

[ASP.NET/JavaScript] Gridview內checkbox無勾選刪除需警告

說明:GridvView提供每筆record勾選CheckBox以多筆刪除,刪除前需有警告視窗,但無勾選任何CheckBox即按刪除button,需顯示無勾選項目。

<script type="text/javascript" language="javascript">
    function CheckBox() {
        //get all input element
        var allInputObject = document.body.getElementsByTagName("input");
        var checkCount = 0;
        for (var i = 0; i < allInputObject.length; i++) {
            if (allInputObject[i].type == "checkbox") {
                if (allInputObject[i].checked) {
                    checkCount++;
                }
            }
        }
        if (checkCount == 0) {
            alert('<asp:Literal ID="Literal1" runat="server" Text="無勾選資料" />');
            return false;
        }
        else {
            return confirm('<asp:Literal ID="Literal2" runat="server" Text="確定要刪除?" />');
        }
    }
    </script>

//刪除button
<asp:Button ID="btnDel" runat="server" Text="刪除" onclick="btnDel_Click" onClientClick="return CheckBox();"/>

[ASP.NET] 使用ResolveUrl找js的絕對路徑

說明: 有使用MasterPage,無法使用相對路徑。ResolveUrl方法是從root目錄出發。


//js放在root/js下
<script type="text/javascript" src='<%=ResolveUrl("~/js/xxx.js") %>'></script>

//css放在root/css下
<link rel="stylesheet" href="css/xxx.css" type="text/css" />

//MasterPage做網站登出
ResolveUrl("~") + "login.aspx"