@IBOutlet weak var btnStart: UIButton! @IBOutlet weak var progress: UIProgressView! @IBOutlet weak var labelMsg: UILabel! //計時器 var timer: Timer? //計數 var count : Int = 0 override func viewDidLoad() { super.viewDidLoad() progress.frame.size.width = 250 //可以自訂progress顏色 progress.progressTintColor = UIColor.red progress.trackTintColor = UIColor.darkGray progress.progress = 0 } @IBAction func donloadClick(_ sender: UIButton) { //按鈕失效 避免重複點擊 btnStart.isEnabled = false count = 0 //參數順序亂掉會報錯 //The runTimedCode selector means that the timer will call a method named runTimedCode() every 0.5 seconds until the timer is terminated timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector:#selector(runTimedCode), userInfo: nil, repeats: true) } func runTimedCode() { progress.progress = Float(count) / 100 labelMsg.text = "process: \(count)%" count += 1 if count > 100 { timer!.invalidate() // stop timer = nil btnStart.isEnabled = true } }參考資料:hackingwithswift.com
2016年12月26日 星期一
[IOS] Progress View
2016年12月15日 星期四
[IOS] ImageView 翻圖片
裡面有用到兩種不同Array寫法來存圖片
class ViewController: UIViewController { @IBOutlet weak var btnPre: UIButton! @IBOutlet weak var btnNext: UIButton! @IBOutlet weak var labelName: UILabel! @IBOutlet weak var image: UIImageView! //兩種array方法 var arrayImage = ["水上威尼斯","史特拉斯堡-2","科瑪", "新天鵝堡_繽紛","春露"] var pic: [UIImage] = [ UIImage(named: "水上威尼斯")!, UIImage(named: "史特拉斯堡-2")!, UIImage(named: "科瑪")!, UIImage(named: "新天鵝堡_繽紛")!, UIImage(named: "春露")! ] var current:Int = 0 var count:Int = 0 override func viewDidLoad() { super.viewDidLoad() count = arrayImage.count //image.image = UIImage(named: "水上威尼斯") image.image = pic[0] labelName.text = arrayImage[0] } @IBAction func preClick(_ sender: UIButton) { current -= 1 if current < 0 { current = count - 1 } //image.image = UIImage(named:String(arrayImage[current])) image.image = pic[current] labelName.text = arrayImage[current] } @IBAction func nextClick(_ sender: UIButton) { current += 1 if current == count { current = 0 } //image.image = UIImage(named:String(arrayImage[current])) image.image = pic[current] labelName.text = arrayImage[current] } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
[IOS] 自訂生成按鈕(CustomButton)
範例是在書上看到的,不過程式碼我有改過,因為Swift 3 出來了,而市面書上的範例程式碼... 你懂的
這篇主要是講後端生成程式碼 以Button為例
yourButtonName.addTarget(self, action:#selector(functionName(sender:)), for: .touchUpInside) fun functionName(sender:UIButton) { //.... }
action 這邊 如果沒有回傳值 (sender:) 就不用加了
View 的截圖 自訂12個按鈕
Controller全部程式碼
class ViewController: UIViewController { @IBOutlet weak var labelTel: UITextField! @IBOutlet weak var labelMsg: UILabel! override func viewDidLoad() { super.viewDidLoad() for i in 0...11 { let x:Int = 100 + (i % 4) * 60 let y:Int = 140 + (i / 4) * 60 let buttonNumber:UIButton = UIButton(type: UIButtonType.system) as UIButton //按鈕位置 大小 buttonNumber.frame = CGRect(x: x,y: y,width: 40, height: 35) //文字顏色 buttonNumber.setTitleColor(UIColor.white, for: UIControlState.normal) //按鈕背景 buttonNumber.backgroundColor = UIColor.black //字型大小 buttonNumber.titleLabel?.font = UIFont(name: "System", size: 22.0) if i == 10 { buttonNumber.setTitle("X", for: UIControlState.normal) //加入事件 #selector(funcName(sender:)) 函數是有參數的 buttonNumber.addTarget(self, action:#selector(clearClick(sender:)), for: .touchUpInside) } else if i == 11 { buttonNumber.setTitle("OK", for: UIControlState.normal) buttonNumber.addTarget(self, action:#selector(sureClick(sender:)), for: UIControlEvents.touchUpInside) }else { buttonNumber.setTitle("\(i)", for: UIControlState.normal) buttonNumber.addTarget(self, action:#selector(numberClick(sender:)), for: UIControlEvents.touchUpInside) } //加入按鈕 view.addSubview(buttonNumber) } } func sureClick(sender:UIButton) { if labelTel.text?.lengthOfBytes(using: String.Encoding.utf8) == 10 { labelMsg.text = "Call " + labelTel.text! } else if labelTel.text == "" { labelMsg.text = "Please enter your phone number." } else if (labelTel.text?.lengthOfBytes(using: String.Encoding.utf8))! > 10{ labelMsg.text = "Error" } } func clearClick(sender:UIButton){ labelTel.text = "" labelMsg.text = "" } func numberClick(sender:UIButton) { labelTel.text = labelTel.text! + sender.currentTitle! } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
2016年10月11日 星期二
[IOS] Rotation & Scale
這是在網路上找的教學
照著做了N遍......有些小疏漏,錯了就重來再重來這樣
確保自己可以記住QQ
想說以後弄個桌遊APP出來的時後 可以不用這麼辛苦
總之 這算是為了往後的作品做的前期準備吧XD
2016年8月11日 星期四
2016年8月8日 星期一
[Chrome] Notification 通知視窗
window.addEventListener('load', function () { //確認使用者是否允許跳窗,如果沒有,就跳窗取權限 if (window.Notification && Notification.permission !== "granted") { Notification.requestPermission(function (status) { if (Notification.permission !== status) { Notification.permission = status; } }); } function NotifyMsg() { var option = { tag: 'Notification', body: '測試測試測試', data: 'I am a data', icon: '' //可以自訂ICON } var n = new Notification("Title", option); setTimeout(n.close.bind(n), 5000); console.log(n.data); n.onclick = function (event) { event.preventDefault(); // prevent the browser from focusing the Notification's tab window.open('http://www.google.com.tw/', '_blank'); } } var button = document.getElementsByTagName('button')[0]; button.addEventListener('click', function () { // If the user agreed to get notified // Let's try to send ten notifications if (window.Notification && Notification.permission === "granted") { NotifyMsg(); } // If the user hasn't told if he wants to be notified or not // Note: because of Chrome, we are not sure the permission property // is set, therefore it's unsafe to check for the "default" value. else if (window.Notification && Notification.permission !== "denied") { Notification.requestPermission(function (status) { if (status === "granted") { NotifyMsg(); } // Otherwise, we can fallback to a regular modal alert else { alert("Hi!"); } }); } // If the user refuses to get notified else { // We can fallback to a regular modal alert alert("Hi!"); } }); });
參考資料: MDN
2016年8月3日 星期三
[JQuery] slideShow 輪播
記錄一下 好用的輪播套件 slick 連結
然後下面範例是拿其他教學範例多加的功能
在特定的高度上會停止撥放幻燈片
然後下面範例是拿其他教學範例多加的功能
在特定的高度上會停止撥放幻燈片
$(document).ready(function (){ //window.scroll 抓取使用者滾輪高度..這裡自訂600 var stop = false; $(window).scroll(function () { var scrollTop = $(window).scrollTop(); if (scrollTop >= 600 ) { console.log("stop" + scrollTop); stop = true; } else { console.log("r" + scrollTop); stop = false; } }); var num = 1; var tNum = 5; var duration = 2000; console.log("A"); run(); $("#box").mouseover(function () { stopRun(); }) .mouseout(function () { run();}) for (var i = 1; i <= tNum; i++) { document.getElementById("tab" + i).onclick = show; document.getElementById("con" + i).style.display = "none"; } document.getElementById("con1").style.display = "block"; document.getElementById("tab1").className = "now-tab"; //在 autoShow 判斷是否停止撥放 function autoShow() { if (stop) return; for (var i = 1; i <= tNum; i++) { document.getElementById("con" + i).style.display = "none"; document.getElementById("tab" + i).className = ""; } if (num < tNum) { num++; } else { num = 1; } document.getElementById("con" + num).style.display = "block"; document.getElementById("tab" + num).className = "now-tab"; } function show() { num = this.id.substr(3) - 1; autoShow(); } function stopRun() { clearInterval(myInterval); } function run() { myInterval = setInterval(autoShow, duration); } });來源:Flycan-輪播廣告 教學
2016年7月28日 星期四
[SQL] 暫存表 Temporary Tables
最近遇到一些情況
都是可以用到暫存表去解決的
偏偏以前從沒機會使用過(也沒聽過 XD)
感謝同事幫忙 >_<
狀況 1. 搜尋出來的資料量太大,EXCEL沒辦法全部貼上
---> 把資料撈進暫存表 再從暫存表下條件慢慢撈~~
狀況2. 依照EXCEL上的資料順序 去撈取資料, 再把撈到的資料貼到EXCEL上
---> 所以先把EXCEL的資料建表 order by 一些欄位 就可以了)
都是可以用到暫存表去解決的
偏偏以前從沒機會使用過(也沒聽過 XD)
感謝同事幫忙 >_<
狀況 1. 搜尋出來的資料量太大,EXCEL沒辦法全部貼上
---> 把資料撈進暫存表 再從暫存表下條件慢慢撈~~
狀況2. 依照EXCEL上的資料順序 去撈取資料, 再把撈到的資料貼到EXCEL上
---> 所以先把EXCEL的資料建表 order by 一些欄位 就可以了)
//狀況1 select email into #tempMail from member with(nolock) where ..some conditions SELECT * FROM #tempMail WHERE email LIKE 'A%' ORDER BY email //狀況2 //暫存表的建法 是在table名稱前加上 # create table #tmp_table (return_id nvarchar(30) , pid nvarchar(20)) //建完後insert資料 insert into #tmp_table(return_id ,pid) values('XXXXXX','YYYY')
[SQL] 依照 in 來排序
// 這裡是用 ,pid, 當作排序依據 charindex(exp1,exp2)會回傳exp1所在的位置,起始值是1 select pid,name from temp where pid in ('p004','p008','p435','p123','p056') order by charindex(',' + cast(pid as varchar(10) + ',' , ',p004','p008','p435','p123','p056,' ))
//如果排序的對象有空白(不管空白是在字串前或後) 可以用 rtrim() 來Trim掉空白 select rtrim(pid),name from temp where pid in ('p004','p008','p435','p123','p056') order by charindex(',' + rtrim(cast(pid as varchar(10)) + ',' , ',p004','p008','p435','p123','p056,' ))
reference:
rtrim()
charindex()
2016年7月25日 星期一
[Android] 連WebService 拋接資料 心得 [註:沒內容]
這次我想練習 android 去連 WebService 實作拋/接 資料(Json)的部分
首先,我寫了一隻WebService
然後 Android 的CODE 也準備好了....
登!登!登! 因為我是用 VS 的測試開發環境
所以根本連不上Q__Q
所以呢...我就看看別人怎麼寫就...放棄了 ORZ
最近跑去玩XCode了...
玩android弄得我有點心力交瘁
一下子跑出記憶體不足 當機
一下又因為我太菜 Android Studio有些問題要解好久
不然就是卡卡的
難過 傷心
如果有機會 我會再更新這個Tag
2016年7月6日 星期三
[SQL] CONCAT() 連結兩個以上的字串
//EX1 SELECT CONCAT(Country , + ',' + City , + ',' + Zip) as address FROM Table //Ex2 SELECT Country ',' + City + ',' + Zip as address FROM Table
CONCAT(string1,string2)
可用來連接2個以上的字串, 參數值可以是字串,數字,空字串或NULL
那和單純的用 + 號串連字串 (Ex2) 有什麼不一樣呢?
不同點在於 如果我串連的字串裡面有欄位是 NUll
那麼Ex2 出來的結果 也會是 NULL ,但Concat 會忽略Null欄位 正常顯示
舉例: Zip 如果為 Null
Ex1 address 會是 英國,倫敦
Ex2 address 會是 NULL
2016年6月19日 星期日
[Android] 試玩App
實作並完成項目
請輸入密碼 可看完整截圖 (提示:萬年4碼生日)
- 分頁Tag切換
- 樣本圖片(首頁) 圖片輪播
- 定單 按鈕聯結browser分頁
- 寫真 PhotoGrid 點照片可看全圖
- Photo可儲存、可設成桌布
- 問與答 資訊開合呈現
但那時候寫的時候方法想錯了
所以聊天沒做好(訊息接收呈現什麼的...)
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
2016年6月15日 星期三
[SQL] Datediff 算出時間間隔
例子昰 刪除 超過10分鐘的資料
會用到 DATEDIFF
DateDiff(時間單位,StartDate, EndDate) 昰用來計算時間的間隔,會回傳正負整數
會用到 DATEDIFF
DateDiff(時間單位,StartDate, EndDate) 昰用來計算時間的間隔,會回傳正負整數
DELETE FROM [Table] WHERE ( SELECT ID FROM [Table] WHERE DATEDIFF(minute,CreateTime,getdate()) > 10 ) --順便塞一下 用SQL 算出這個月的最後一天 SELECT DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE() ), -1)
2016年6月7日 星期二
2016年6月2日 星期四
[SQL] 在Insert時 傳回新增的ID SCOPE_IDENTITY()
/* SCOPE_IDENTITY() 會返回最後一個識別值*/ INSERT INTO TableName (Column1,Value1,CreateDate) VALUES ('New',1,GETDATE()) SELECT ID FROM TableName WHERE ID = SCOPE_IDENTITY();
用ExecuteScalar()進行搜尋
會返回 int
其他類似的參數 還有 @@IDENTITY、 IDENY_CURRENT
[asp.net]一些日期應用
//取得 上個月月底的天數 string lastMonth = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.AddMonths(-1).Month).ToString() //取得現在時間的日期 int nowDate = DateTime.Now.Day
2016年5月24日 星期二
[azure]靜態頁放置在Micrsoft Azure 雲端空間
首先,要先用信用卡註冊一個可使用免費ㄧ個月的帳號
https://azure.microsoft.com/zh-tw/free/
接著進入azure https://portal.azure.com/
點選 +新增 > Web+行動 > Web應用程式
因為範例是放網頁靜態頁 所以我選Web應用程式
發行成功,會自動跳出你發行的網站
網址是 xxx.azurewebsites.net
xxx是你自行填入的應用程式名稱
https://azure.microsoft.com/zh-tw/free/
接著進入azure https://portal.azure.com/
點選 +新增 > Web+行動 > Web應用程式
因為範例是放網頁靜態頁 所以我選Web應用程式
填入資料 按建立
設定部屬認證
這裡填入的帳號密碼,是若使用FTP/Git上傳檔案時使用
發佈網站
回到Visual Studio , 打開欲發行的專案 > 建置 > 發行
發行成功,會自動跳出你發行的網站
網址是 xxx.azurewebsites.net
xxx是你自行填入的應用程式名稱
2016年5月11日 星期三
[JS]判斷瀏覽器 navigator.userAgent
function isMobile() { // return true; if (isMobiles.any()) { return true; } else { return false; } } var isMobiles = { Android: function () { return navigator.userAgent.match(/Android/i); }, BlackBerry: function () { return navigator.userAgent.match(/BlackBerry/i); }, iOS: function () { return navigator.userAgent.match(/iPhone|iPad|iPod/i); }, Opera: function () { return navigator.userAgent.match(/Opera Mini/i); }, Windows: function () { return navigator.userAgent.match(/IEMobile/i) || navigator.userAgent.match(/WPDesktop/i); }, any: function () { return (isMobiles.Android() || isMobiles.BlackBerry() || isMobiles.iOS() || isMobiles.Opera() || isMobiles.Windows()); }, FB: function () { return navigator.userAgent.match(/FB/i); }, FBIOS: function () { return navigator.userAgent.match(/FBIOS/i); } }; function PostFB() { try { if (isMobile()) { shareurl = "https://www.facebook.com/dialog/feed?app_id=' + MyappID + '&display=touch&caption=Mycaption&link=http%3A%2F%2Fwww.google.com.tw&picture=' + MyPictireLink + '&redirect_uri=' + Myredirect +'&description=Mydescription"; window.open(shareurl); location.href = 'http://www.google.com'; } else { FB.ui({ method: 'feed', link: 'http://www.google.com', caption: '#', redirect_uri: 'http://www.google.com', picture: MyPictureLink, name: 'name', message: 'message', description: 'description', }, function (response) { if(response == undefined){ //...do something } else{ //...do something } }); }
[MVC] 簡易分頁 PagedList
1. 先安裝 NuGet套件 - PagedList.Mvc
2. Controller
3. View
需要using PagedList.Mvc 和 PagedList
取得分頁:
https://github.com/TroyGoode/PagedList
2. Controller
using PagedList; using PageList.Models;
public ActionResult Index(int page =1) { //page用來記憶目前是哪一頁 int currentPage = page < 1 ? 1 : page; //資料必須先經過排序 var product = db.Product.Where(x => x.Status == 1).OrderBy(x => x.ID); //分頁資料使用 ToPagedList() //參數分別是傳入所要分頁的頁碼以及分頁資料量 //此範例就是每一頁會有10筆資料 var PageResult = product.ToPagedList(currentPage, 10); return View(PageResult); }
3. View
需要using PagedList.Mvc 和 PagedList
取得分頁:
@Html.PagedListPager((IPagedList)Model, page => Url.Action("Index", new { page = page}))
//設定PagedListRenderOptions 可更改樣式 @Html.PagedListPager((IPagedList)Model, page => Url.Action("Index", new { page = page}) ,PagedListRenderOptions.MinimalWithPageCountText)
//也可以自由設定顯示物件 @Html.PagedListPager((IPagedList)Model, page => Url.Action("Index", new { page = page}), new PagedListRenderOptions { DisplayLinkToIndividualPages=false, DisplayLinkToFirstPage =PagedListDisplayMode.IfNeeded, DisplayLinkToLastPage= PagedListDisplayMode.IfNeeded, DisplayLinkToNextPage = PagedListDisplayMode.IfNeeded, DisplayLinkToPreviousPage = PagedListDisplayMode.IfNeeded, DisplayPageCountAndCurrentLocation = true, PageCountAndCurrentLocationFormat ="第{0}頁 / 共{1}頁" })
https://github.com/TroyGoode/PagedList
2016年5月5日 星期四
[JS]上傳檔案大小限制
因為沒限制檔案上傳大小
所以發生了一些美麗的誤會~~~ T_T
發了此篇,以謹記在心
所以發生了一些美麗的誤會~~~ T_T
發了此篇,以謹記在心
var size = document.getElementById("file").files.item(0).size; if (size > 10240000) { alert("上傳檔案請小於 10M"); return false; }
2016年5月3日 星期二
[C#][EXIFextractor] Mobile Web 上傳圖片,照片翻轉90度 rotateImage
遇到這種問題 有點傻眼
不知道怎麼解決,測了也沒發現什麼規律性的原因(偏偏我就是拿偏偏我就是用iphone safari)
頓時有了希望全世界都生活在智障型手機的時代是多麼美好,多麼幸福,多麼......方便 ORZ
不過感嘆歸感嘆,希望歸希望,身為21世紀現代人類,還是要追求一下科技進步、社會發展
不用你們提醒我,我知道我現在很難得的正在囉嗦.............
[問題原因] 貌似是瀏覽器吃不到照片的一些tag
這裡有針對IOS詳細介紹照片方向的問題
解決之前 還要加入參考
點我連結下載頁面 進去之後點 Donload Source files
code在這
方便大家 也為了防止頁面被404狙擊 我還是備份一下
HttpPostedFile file = HttpContext.Current.Request.Files["file"]; //Create bitmap image from posted file System.Drawing.Bitmap bmpImg = new System.Drawing.Bitmap(file.InputStream); //rotate if needed bmpImg = rotateImage(bmpImg); //save image targetFilePath = "somewhere..."; bmpImg.Save(targetFilePath, ImageFormat.Jpeg);
public Bitmap rotateImage(System.Drawing.Bitmap img) { try { RotateFlipType rft = RotateFlipType.RotateNoneFlipNone; System.Drawing.Imaging.PropertyItem[] properties = img.PropertyItems; foreach (System.Drawing.Imaging.PropertyItem p in properties) { if (p.Id == 274 || p.Id == 5029) { short orientation = BitConverter.ToInt16(p.Value, 0); switch (orientation) { case 1: rft = RotateFlipType.RotateNoneFlipNone; break; case 3: rft = RotateFlipType.Rotate180FlipNone; break; case 6: rft = RotateFlipType.Rotate90FlipNone; break; case 8: rft = RotateFlipType.Rotate270FlipNone; break; } } } if (rft != RotateFlipType.RotateNoneFlipNone) { img.RotateFlip(rft); } } catch { } return img; }
2016年4月26日 星期二
[Jquery]scrollTop 滑鼠滾到指定位置,顯現DIV(浮水印 Top)
$(function(){ $(window).scroll(function () { if ($(this).scrollTop() > 800) { $('.left_BOX').fadeIn("fast"); } else { $('.left_BOX').stop().fadeOut("fast"); } }); });
<div class="left_BOX" style="display: none; position: fixed;">
<div class="goTop" style="display: none;position: fixed;margin-top: 60px;">
<a href="#"></a>
</div>
</div>
幾個重點 :
滑鼠要滾到指定位置,才會出現元素 => 預設是看不見的 display:none
元素要固定在頁面的某處 ==> position: fixed
至於固定的位置可以用 top left right bottom 自行隨意調整
goTop比較簡單的寫法 可以設置連結(#) 就可以回到最頂端了
2016年4月12日 星期二
[C#]string[] convert to int[]
字串陣列 轉換成 數字陣列的寫法
string[] tempRGB = str.Replace("rgb(", "").Replace(")", "").Split(','); int[] RGB = Array.ConvertAll(tempRGB, x => int.Parse(x));
2016年3月28日 星期一
[Jquery] FB上傳大頭照的裁減選圖
imgAreaSelect
教學 : http://kevintsengtw.blogspot.tw/2012/01/aspnet-mvc-jquery-imageareaselect.html
教學 : http://kevintsengtw.blogspot.tw/2012/01/aspnet-mvc-jquery-imageareaselect.html
function ImageArea(){ $('img#imgCut').imgAreaSelect({ handles: true, //是否出現小方塊 易於拖拉 aspectRatio: "1:1", //比例 x1: 0, y1: 0, x2: 100, y2: 100, //預設選取區塊 onSelectChange: preview //及時預覽 //onSelectEnd: someFunction }); };
2016年3月24日 星期四
2016年3月23日 星期三
[JQuery] LazyCode 圖片載入 實現圖片看到哪Load到哪
$().ready(function(){ $("#lazy").find("img").lazyload({ placeholder: "/img/backgroupImg.png", //背景圖 effect: "fadeIn", //特效 threshold: 200, //页面高度200時 開載載圖片 failurelimit: 40 //載到第N個不可見區域的圖片 }); });
//img 的src換成 data-original <div id="lazy"> <img data-original="/img/ShowImg.png" /> </div>
2016年3月20日 星期日
2016年3月16日 星期三
2016年3月14日 星期一
[Swift] 學習資源
APPLE 官方 電子書(英文版)
The Swift Programming Language (Swift 2.1)
繁體中文電子書 (翻譯版本為官方Swift 2.0 教程)
The Swift Programming Language (Swift 2.0)
Swift 線上編譯
http://swiftstub.com/
The Swift Programming Language (Swift 2.1)
繁體中文電子書 (翻譯版本為官方Swift 2.0 教程)
The Swift Programming Language (Swift 2.0)
Swift 線上編譯
http://swiftstub.com/
2016年3月10日 星期四
[javascript]windown.open 新視窗 置中
$(function () { $("#Query").click(function () { //視窗的垂直位置 600是height var Top = (window.screen.availHeight - 30 - 600) / 2; //視窗的水平位置 450 是 width var Left = (window.screen.availWidth - 10 - 450) / 2; window.open('@Url.Action("QueryMainPageID")', "搜尋官網ID", config = "innerheight=600,innerwidth=800,top=" + Top + ",left=" + Left); });
[Lambda] 多次排序的方法~ ThenBy
如果想要OrderBy 多個欄位時,可以用到ThenBy
在OrderBy裡面 寫入多個欄位是不行噠
var Tmp = db.Menu.Where(x=> x.ShopID == 1 ).OrderBy(x=>x.Sort).ThenBy(x=>x.ID);
2016年3月9日 星期三
[台中一日遊] 清水---紫雲宮---鬼洞--高美濕地---逢甲夜市
7:30 台北車站 搭乘國光號 前往台中-朝馬
在朝馬搭乘巨業客運 前往清水火車站
搭車地點是在楓紅古車站 原本是BRT的地方....找了一陣子才找到orz
車程約一小時多
抵達清水火車站,並前往阿財米糕吃午餐(走路路程約20分鐘)
交通:走到清水電信局站 搭巨業客運 178、179 到 清水站 下車 (票價$20) 走中興街
在清水火車站寄行李時,被車站的阿姨們有志一同的推薦吃榮米糕~~
比起有名的阿財和王塔,榮米糕便宜又好吃,就這樣,我們就被推坑哩 =)
結果我們叫了小黃 XD
去米糕店真不錯吃! 不會太硬又清爽的米糕很合我們的口味
比較特別的是他的辣醬,是裝在老闆那邊的塑膠桶子裡,要自己去加
心得是加了真的覺得好辣味道很重,建議原味最好吃
還點了乾麵、肉羹湯、豆腐青菜湯。乾麵玩玩全全擊中我阿!! 下次我還是會跑去吃乾麵
TT__TT 聽友人說這是白色的意麵,豪好吃~~
本來想點大腸湯,但賣完了,老闆推薦切大腸當小菜,但後來我們沒點...有點小後悔
當我們從鬼洞回來,要外帶阿財去高美濕地時,發現榮米糕竟然中午就賣完收攤...好險有先來
吃完午餐 前往鬼洞
交通:
1.台鐵清水車站出發 出站後直行中正街至「清水電信局」公車站搭乘93號公車(往銅安厝)
搭乘公車至中山董公街口下車,在步行約15分鐘
2.從中正路---走到---> 中山董公街口站牌(約4分鐘) ---走到---> 清水鬼洞(約15分鐘)
查了一堆的交通資訊,結果發現,從榮米糕店往前走就到紫雲宮,可以從那邊的粉圓店經過
公圓走到鬼洞。
行程裡也就順便加了個紫雲宮,也意外發現紫雲宮不只是間大廟,是間非常大的廟...
本只是借個廁所,發現裡面別有洞天,有點驚訝
從粉圓店旁的僻靜小巷往上走,走到步道上,豁然開朗,風景和小徑別有風味
許是春天來臨,有株櫻花樹開,樹木上的綠葉一點也不遜色
前方的公圓有小孩嬉鬧的聲音,公園裡有一塊地,專門規劃了打擊樂器給小朋友玩
我們的時間就耗在這裡了,相機快門是一直按按按,拍拍拍。
回程時也去公園玩了一遭,好喜歡這種設施 XDD
前往高美濕地 看夕陽~~
交通:中山董公街口 搭客運178、179 到達高美濕地注意發車時間!!! 我們這邊是搭小黃,公定價$ 80 (有些喊價會比較高)
推薦一下那邊的烤魷魚 是個阿伯和阿婆經營的,後面有大桌,計程車司機常在那吃東西休息
打屁聊天。
重點是魷魚! 不會乾,有Q勁,很肥很好吃 >___<
因為下雨,所以忘拍照了...那裡有一排的烤魷魚
恩...就這樣吧 Orz
逢甲夜市吃晚餐
交通:時間關係,還是搭小黃,高美濕地到逢甲 一人 $ 200
我們和計程車司機約了~所以還是同一個人載我們
我們和計程車司機約了~所以還是同一個人載我們
中途停了清水火車站拿行李,計程車司機順便載我們到聽說得了2次太陽餅冠軍店吃餅吃到飽囧
滿高級的店,去了先找空桌,服務員問要咖啡(星巴克咖啡)還是茶(阿里山烏龍)
太陽餅、芋頭酥 好吃 。其他普通
我有個朋友買一盒,我和他買一個,拿回家孝敬我媽 XD
太陽餅、芋頭酥 好吃 。其他普通
我有個朋友買一盒,我和他買一個,拿回家孝敬我媽 XD
巨業客運 官網
清水鬼洞 地址:台中市清水區鰲峰山公園北側
【清水區公所】洽詢電話:04-26270151轉306
清水鬼洞假日免費參觀
假日營業時間從9:00 ~ 15:00 入場須換證才可進入
平日營業時間:09:00 ~ 20:30
阿財米糕
地址:台中市清水區西寧路105號
電話:(04)2622-9853
營業時間:09:00 ~ 20:30
2016年2月18日 星期四
[JQuery].eachcheckbox 全選 略過特定條件
要做出快速全選的表單時
第一個項目 口全選 被打勾,但是我又不要他的屬性
可以這樣做...
給全選一個特殊的class : CheckALL
在each時,發現class=CheckALL 就略過,繼續執行
只要加個 return true; 就行了
第一個項目 口全選 被打勾,但是我又不要他的屬性
可以這樣做...
給全選一個特殊的class : CheckALL
在each時,發現class=CheckALL 就略過,繼續執行
只要加個 return true; 就行了
var No = ""; if ($(".chk").is(":checked")) { $("#Product input:checked").each(function () { if ($(this).attr("class") == "CheckALL") { return true; } No += $(this).attr("id").split("_")[1] + ","; });
2016年2月16日 星期二
在ActionResult中呼叫ActionResult的Function,並接到Json
就是吧! 當我要新增資料 發現 資料庫已經有這筆資料存在時,就改作Update的動作
Update這個Function 已經存在了,所以就想著直接CALL....
喔!!! 這件事就這麼發生了
介紹一下兩個Funtion
新增 --> ActionResult AddNewProduct ,傳回 bool success, String ErroMsg
Update --> ActionResult ProductUpdate 傳回 bool iResult , String Msg
傳回的東西都是 JsonResult , 我想要抓到 ProductUpdate 的Json 回到 AddNewProduct 傳出去
具體怎麼做剛開始還覺得有可能嗎?真的能成嗎?
一方面又覺得若不行 那真的太笨了 =__=
然後我就問了...行呀! 真的能~~
看看片段的實作 CODE
[HttpPost] public ActionResult AddNewProduct(string ID) { bool iResult = true; string msg=""; bool update = true; if (update) { //把要呼叫的Function ActionResult 轉型成 JsonResult JsonResult r = (JsonResult)ProductUpdate(ID,true); //因為拿到的r是object 所以再轉一次 dynamic resultData = r.Data; //要用的時候,也要給他型別才行 iResult = (bool)resultData.success; if(iResult) { msg = (String)resultData.FinishMsg; msg = msg.Replace("更新", "匯入"); }else { msg = (String)resultData.ErrorMsg; msg = msg.Replace("更新", "匯入") + "請重新新增商品"; } } else { //新增資料 } return new JsonResult() { Data = new { success = iResult , Msg = msg } }; }
附上 stackoverflow
還是GOOGLE的高亮程式碼漂亮阿!
其實每次要把CODE放上來我都會腦抽忘了怎麼弄ORZ
2016年2月15日 星期一
2016年2月4日 星期四
[Lambda]Contains 一次搜尋多筆資料
Lambda 語句中,進行類似 SQL in 的搜尋方法
string[] ArrayNo = {"A111", "B222" , "C333" }; var tmp = db.Product.Where(x => x.Status == 1 && ArrayNo.Contains(x.No)).ToList();
2016年1月20日 星期三
2016年1月19日 星期二
2016年1月10日 星期日
[C#]DataTable select 條件搜尋和排序
塞選出 Name = Ash , 用ID和Age 做排序
DataRow[] tmp = MyDataTable.Select("Name='Ash' ", "ID,Age");
2016年1月8日 星期五
2016年1月6日 星期三
[MVC]CheckBox複選、全選、取消
我忘了有沒有寫過類似的東西
剛好今天有空,索性整理一下吧
JQUERY
Checkbox是長這樣的
<input type="checkbox" value="1" @checkList[1]><label>AA</label>
Controller
接到勾選的Tab後,去DB搜尋
之前寫的不太簡潔,順帶記錄一下新寫法
JQUERY
// Tab名稱的全選和取消 $("#AllTab").change(function () { if ($(this).is(":checked")) { $("[id*=chkTab] input").prop("checked", true); } else { $("[id*=chkTab] input").removeAttr("checked"); } }); $("[id*=chkTab] input").on("change", function () { //全部都選到了,"全部"這個選項打勾,反之,則取消 if ($("[id*=chkTab] input").length == $("[id*=chkTab] input:checked").length) { $("#AllTab").prop("checked", true); } else { $("#AllTab").removeAttr("checked"); } });View 順便講一下好了,checkList 這個是用來記錄CheckBox選取的狀態 MVC 才可以這樣用......
//這段程式碼可以不用理他,是POSTBACK 回來時 //想讓畫面保留勾選的項目 @{ string[] checkList = new string[7];//最後一個存放 全部 的狀態 if (splitFilter[1] != null) { string[] splitck = splitFilter[1].TrimEnd(',').Split(','); if (splitck[0] != "-1") { foreach (string i in splitck) { checkList[int.Parse(i) - 1] = "checked"; } } } }
Checkbox是長這樣的
<input type="checkbox" value="1" @checkList[1]><label>AA</label>
Controller
接到勾選的Tab後,去DB搜尋
之前寫的不太簡潔,順帶記錄一下新寫法
if (Tag != "-1") { ListTagCondition = new List (); foreach (var t in Tag.Substring(0, Tag.Length - 1).Split(',')) { TagCondition.Add(Convert.ToInt32(t)); } product = product.Where(x =>TagCondition.Contains(x.TabName)); }
訂閱:
文章 (Atom)