參考資料:hackingwithswift.com
- @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
- }
- }
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 連結
然後下面範例是拿其他教學範例多加的功能
在特定的高度上會停止撥放幻燈片
然後下面範例是拿其他教學範例多加的功能
在特定的高度上會停止撥放幻燈片
來源:Flycan-輪播廣告 教學
- $(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); }
- });
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可儲存、可設成桌布
- 問與答 資訊開合呈現
但那時候寫的時候方法想錯了
所以聊天沒做好(訊息接收呈現什麼的...)
wqjCn8O8a1UBITAhITAhLS43woJWF8KTw7whMzQhw43CgsOawrzCgH3Cn2ctwpnDksOKVcKLw6xgw7bCl8OVw7JKM8OOS8KELRrCqCEzNCHDncOaITQ1IRxgQcORBz8rw6l6w7AtKXo+wrnDlsOaVsOQdEkDw6/DksOGwr/CkC3CgMOyw7fCjlHClC9mX8O/HFhGwq8ewrstwpLCrytHZXlYKsKUbMOYKMK4LlrDpC1xw6wac8Oew6vCkyExMCFBIx7DnRzDr2zDoS15KGLCtzPCjjYQGcOwbMKawq0+w4nDjy1nE1pFZMOiw4U0wo7DpsKxSMO/w5nDvsKJLcOVeiE5IQMDITEzIcOHwqUcwoMhMTIhwqEhMzQhw7AUwqgtwrAhNDUhwpTCujJBwrQebngCP8OuwqsgGC3CrSxiw6HCq8Olwr4lITEwIXdLWEU5ITEzISExMiEtwpXCmnU/AcONNFcHWsKOwoptK2fDnS1GwpbDtcKsw4nCpMKcKcO/woJ3E0bCusK+RC1fw4pKKGbCisOGc8KbYsKmcMKTSsONEC0hMTAhRsKkNcOcwrLCikooAz/Cv8O+wpVKWi3ClDgvw6nDm0rDmMO+F8Khw4HDu3chMzQhwrHDqC3CpcOMwrfCmS5yworDu08cW8OMOcKiD8OGLT8cw4dhw6HDrsOmLxTCsBFoScOlH8KHLcKjGcKrXMKQbMKHw5DDgMObw6caM0TCu8OaLcKrMcOdwpnDgEvCuCExMCFGITEwIcK+ITkhU3rCmsKtLcOqwplQEcOHwq7Dr19nZH4cAi5aVi0yEBvCr1UYRVDCsBx2WMKuw5jDkCgtw6IhMzQhwr4vWsKTwqplw4FPazHDnMKQw5DCmi3ClMK9w7N1KGcRZ8KVw6EOGsO7XsKPQC0ESsKhw549AQ/DqcK6wpXDmUHDqDYCw5Mtw4F3dMKSw7pWw4zCsUHDmsO7wqtvMljCny3DrDrClRpMITExIcKOwpdrw45Iw43ChW5ZaS3DmwVWU8KSSMK7wp3Dm8KyD8KGQnDDtSktwqbDoBPDuMO/w4rDvcOLwoTDqMOhw6FTGENVLcOoF8OuKsORR8KbwpNhw4TDgcOPwoDCrCrDtS01wrwqUcO1HMKLLxjCsnXCgMKqaW0hMzMhLcKKwpNCOGxBTkYpw7zDoG8oPzTDny1ewp0TEMOGbyE0NSE4w6/Ch8KCw7M9wqHDiMOvLcOcRsO0w7XCqUvCnMKpccOsITEwISwrw7UowoUtwrTCoiEwIcOWT8KsLGvDoyEzOSFUwoI7wo5ZwqwtwrEGwqXDrsOxc8Ozb8K6d2TCr8O1w5jCvsKGLSXCn188bMKcEyExMSHDrsOUw5DDocOdFcKjwqwtBcO3BsO9wqhjw7LCo8K7VMO5JgTDtlk3LXTDt1bCp8Klw5gXITM0IcOWw6PCh8Ozw7LDisK9AS3Dg8KUV8KJGWLCusKtCHPDpcO1w4jChm9wLSrDs2XDv8OLQkJJWMKlw4shMTYwIcOow5MhMCHCiS1XBsOmwp/Du8ODd2jDjFdMwotcO8KLwoctw53DkFnCjnfClcOPw4nDkUQ+c8OGw5/CpUUtwr/CmcO4ITEzIcOYSWHDgkQZFsORwpdlw5zCvS3CscKWCMOEO8OYw6PDk1rDq8Kewp8vRyE5IcKaLWUhMzQhBsKdZcKtwpdubg/Cp8K9w47CucOFw74twq9BFR1SwoXCm8Kzw7vDhcO0wpohMzMhwqTDt8OXLcOAQ1vDucOCZsOAwovCucKvw7kSGj1idC3DrsOQw41gw6s2w4BVVcOOfcOxITE2MCFyw6LCuS3Ds8Ogw4bCgx7CvQjCi3tjw41Swr3DkDk/LQZNVsKUIMKEw4wFWMKDw6hTw7wrwqXDsy1Mw5nCgsKOGMOyEzhzw43DjsKjw4/DvE/CrC3DuSExMSHCvHXCjsO+HcK+ITExIXI0wr/Drz3DgEUtwrHDrcKfw5LDpXvDrTEaw618CMO+wpdfw4UtLERkVx/DhRTDjcOwwrREwqTDucOHw47Diy3ClTPDksOTfDTCuB3Cs8Kkwr3DlcOLITM0IW/DkC10BUzDln7DnyExMSHCszbCjMKawp1vPEpVLcKkw53CsnTDgzQzwqnCp0rDtMK6ITM5IcKnfBstbcKCwrV+ITEyIcOkw6nDkcKnw7cYwqtkFMOhfC3DgFjCo3tlwqJRZREHSHjCiD86Hy0PYnLDk3ATwrXDjw9XITEyIT88QFfCsC3CrEbDpVXDu8KSeFvCpMKIwrLCtVDDuDJlLcOIwo4hMTMhw4AqwrTCt8OYKjnDhmLDm8KVPVgtScK0w7vDomvCq8KJEyExMSFxw4shMzQhU3/CjSEwIS0WPsK3B8OpUTTDqXImw4nDsyExMiHDvm5+LSjCh1ZRacO3w5oUw6hIMnDCtCExMSEhMCF+LX3DlsKFaMO+ehMjwoJ0wpPDk8KtEg7CgS0Zw5JVw63DhFwawoRew4HCgsKydmcowqstw50HwrUoJmxZcB7DvEEYZ8Kcw7jCni0cw4PDksKmwolKNsKac8KBwrLCnzHDvAZCLWXCp8Odw6vDvx3DtTnDrsKWwp/CvsK2c8OsOC0fw4vCvMK1Um0aw7prUHrDj2E8w61wLVhSwqEQwqcxwqTCtT3ClT7Ch8KIwrTDpSExMiEtbcOGUMOvX8O5SwLCn0rClXJ6CMO8UC02ITkhITM0IQZ0UMK8w6AVw40+w4kvZsKudy3CgTFdw7FXwoXDoBHDq8OxFV1jwr3DsgItI2/Ct8KWe8K1ITEzIUtiJkYDw6jCkDcsLUMbw7A/wrpWHMOFw4lDw53DisOlwrdXw6gtwqU5cxFOVkhtw4DDuG8hMzkhwqrDtcKDw7ktUcK1wpDDlMKcwqPCkX7DosOPM0dkRnbCoS3ConTCixvCl23DnHNyw7AhMTEhw6zCnMK9w5PDmi0Ww4Yjw5/CtsKEd8Knw4rCrwbDkcKxwpPCrU0tfEV0wqopOhTCljzDvVDDpyE5IVYrbC0hMzMhecOOFcOVSsOzwqXDicKYwpYffsKVw5EkLcOZQcK7O8KEXsKXw4IhMzQhw7kwAiEzOSE+w4oULVDDjcOFwrMmwr/DsVbCt8OPw7dPwrFHwqlTLcOeBsORQRfDjhhdw5XDk8KDw4AUFzMxLcKoXsOBw5nDhsKlHznDn8KYMivCr8OfwqjCky3DicOkITM5IXvDuCEzMyEwRSvChnvDg8OFw5XDgMK3LcOGwrEhNDUhw5vClkgcw61owpZcD8KGTsKiwqgtw5k4w5hSw5rCh8KOwrU2w6AhMzMhXMKOwqnCplwtNcObUA7CkcObwpfDthJxwqp8w6LCj8OxMS0caMOWw6Y0ITM5IcOyEMOQasOqITM5IcKKw4jCm8KULUPCksOxw7HCo8KdbVhfwqJfw4Maw44hMCHCmi3Dq21SwpPCl8O6wqHCocOtBcO9w43CocOQwpohMTIhLXfCtFsCw4fCpMKuw6XCmsODwr0gEz1sNS1dwqrCksKSw4p6fnzCtsKHwqXDj1tMGH4twoYUw5/Dtg5Xw5FNwqTCtiE5IcOOITEyIR3Dk2ItUXMhNDUhw4jDgcOVw55se8O1YcKywpbDuk3Cmy3ChExuAsK4bsKCSF/CmcOoITkhAsKpE8O3LXIFWmfCo8OVNFXChRvCsyDDqyExMCHCtzQtwr3CpiEwIVbDiCEzMyHDq8KsSGgId8KdH8KAw4EtVMKOesOlwoIWwqvDqMOIITEwISE5IVLDnSE5ISvDlS0WH8OTQ8Okw4fDjiExMCHCi8O1dsO1wqPCm3zCiS1Iw5NTITEyIcOOITM5IcO1wqUhMzkhTUBzITAhVHxCLcKnITEwIVg+wq7Cs1rDoyExMCFrw77Dtkgjaj0tV1tZwqxBAW0/MSjDrcKKw5XDo8Ogwo4tSRnDrUHDrsO/UB/Dg8OUVFQTb8KZEC0kw4TDjSEwIcK4w4xIAiExMSEvw43DiMKww6vDlMKxLTwIw4cbw4ZIITE2MCE7HlnDsy7DmsKMwqgXLcODwoBAw7/CkMOQITE2MCHChMK7HsKIw60DQ2MHLcKIw5ZhWHjCj0LCicOKw6TDoRc1DnltLTJ5QwVuITEyIcKXw5LCnsOywoXDqsOYwpbDl8OJLXDCrB3CmMOuDyExMSEPwozDhzZow6XChBA6LWRlw6vDrX3DuRLCilUIw6LDvlTDmMKsw6ItUMOWw4E7w5QHw6hUDlcGw6Qbw4IhMzkhKS0uw4rCpcKOQsKewrRmcSBOw5nClyDDsCExNjAhLcKjNTM+w5wowpvDh8OTwrRow7/DpcOmacOPLQjCsSEzOSHDmcOeYMOewqo7wrFcd8Ksw5QdHi1tKMObV8OtITkhcnNLwqghMTMhwpclVsOvwqUtwoFqT19Jw5bDjH7Cmnh3wrxlOyExMiEBLSExMCHCpsKhw4vChMOVQsKhwoLDv8K4JENzw5sZLcKWwr7CpcK9wpPCgcKjaFPDpW7CpMKBd8OVwr4tITMzIcOzZTMkwo1Xw4PDusKpw67DosKqGcOXZS3CkXfCphNgwr7DtljCvcOoLMOcw4PDv3/CrS3DvEdqbMOddsOZRiEzMyFvRWTCocKyZ8KLLTluwpfDmMKWw5wuNcK0wpcgw4FRT1jChS3CtsK5ZgglwqMqITAhw6NIw6gmNcOaw6QeLcO7wovDu8OqwqVcP1jCsyEwIcKiHMOzecOcRC3DgQ5UfSExMiHCt8KtwqF2w43CgMKpcMOyd8OyLV9DT0/Cu8KWG2XClMOdwpHDhUJuw67CjC3CnBAhMTAhw50cwocBMUjDtU/DpcKRw60ZXS06w5HCgFAbYDjDi8Opw6Qvw5vChcKWJkAtfsOlITM5IWjCv8KSwowhNDUhwrXCniEwIRDCrXvCjMK2LRvDl1k5ICExMiF9EMOkw4Eyw5xlw7YqZS3Dg8OQITM5IcOdwrpuITMzIcONwonDmkViwrUrw6PDpy3Cj8OWPcODw5RpVms6wo0Ww57DrsOmUcKmLcOEPizCm8OywpvChMOHw4lTdsO5w5vClsO7w44tG8KKFk7DkyEzNCE4wpLDqEHDi8KmG8OrPXItwohxwr/DiR8Vw7/ChcKsTsKYw4QTwoVbMy1gw5jDg37CuUfDkMKvwokQwr5yUHPDnsOsLcKAV3MXwp3DhMOLQsKQWsOGw6k1XGBMLcO5w4gCdWTCnlHCtcKWw7NIwq1ew6TChsKDLcOzMcOBwqrDomXCpsKtwrDCn8OmYcOPw4Yewo8two4XWcO/EUpWfsKnwr1IRsKhw6bCpcOzLcOLw5DDkhvDpMOFw7AHwoMlITEzIcO7w61cMAMtwoE1wqnCoXnDosKSw4Yefz1TJiEwIcOXWy0pFcOQcMOlw6JoPsOoVcOERAfClMOCwqctEcOMesO/wpHCp1LDkcKtScKEw4jCth3DlDQtwp3DtW1VHcKAw6pgdsO2ITE2MCF9wrVxwqZPLcKuPU7CvMKhPFYCwodqfBgxwqjCnsKMLX3CimcHWRjCj0HCocOjQsK+ZsOhasKlLcOkwpbCgcOww5TDlDbColBsbMOPw5fDgMKmFC3Dk8KGw7fCnWJFw7jCqcOww5whNDUhfMKHR8Obei3CtSE0NSHDvjjCuSEzOSHCpwLCsDzDosOxw7zCq3zCji0pw7rCtFAxE3/DpMONN8KQwpshMzQhwovDtiwtL8OiKMKaTMKfc8OBwoDCp31WwpohMzkhOCAtwq4hMTYwIcOywrAhMzMhEyEwIcOQIB/CgFdHw5/ChsOyLcOVwoPDkcOpw6ARfCExMSHClzBIUWcbwrTDqS3DnMONwpnDrGoXwp8ew4k0TTVEw4Z6wowtw7fCnTwTe0/DpHgXZ1Zhw6YyPRstw4LCpmBcw5XDgQ7DsTzDgznCu8Opwo/Dhl8two3CkWVmw4V+XywQw7rDp0fDvQQTdS0qXwFxeRvCmMOkw7xTITQ1IcO7wqbDhMOMFi3CtyTCtibCtRMhMTAhw5TDmRXDvzPCjhHDr8OpLT57wpbCpyEwITEedzvDksOnw5VDRXnChC0zwpdVwofDg8KVdHbCm8O8woBTwpNLIB4tw4PCqyvDi8K1Az/DkcOFUsKWw43DgcOyw4F8LRjDslNpw6dTw6TCl8ONwrnDtsKWKcOWbT4tHsOBw55NMsOMw7LDiRtVJcOrPm3DjcOjLcKRw63DjCExMyEhMzMhITM5ISExMyF5aCExMiFZasKQP8KGUC3DgsOnwq/CuHAIGMOMw4XCuMKvczdGDsKuLSk+Jj/CtnnCojhtwpnDgCExNjAhwprCq8KuwqktYWJUwrXCpsKHAcKdTcOuX2tUwq9vw7MtwoTCi8KIw7BSRcOoLMK1wrJgFCnCpyvDoC0BZUhNw4bDmjPDp1DDq8K7woHCmV/CtT4tGyExMSFOw6hgwp9gITQ1IcKuw6oPf8OSITkhw4TDhS1fwq1/VmrDkcOjwp/CjR88VMOlwoFubS3DvCExMCF7wphmITM0IUg2wr8FwpEXWAcfRC0VMxPDihnCl8KBwr8TITEwIWzDhcOmUMOxw4EtITM0IcOMRMKMw5URITM0IcO9XEjCpcOzwrwvwqoaLSEwIcONwoQhMTAhccOMwr4RE0IZd0QUEh8tL8KWw7vDvkYBS3/CmU1awotEwr4owoEtSMKOUcOUSMK+ITM0IcOpa3TDkMO5BsKpwpTCjC3Di3bCs8KzPcKtM8OLITkhwrfCi0jClDrCjiE0NSEtwo9bw69Qwq89wpdZHFHDkcO0w7nDgUpVLcKBwoYUwpjDtsK5ITM0ISzCh3jDqCxRw4rDl8KbLWPCq8KPwpxUwqdoasO0wrg9worCtcKMwpfCrC3DjX5vw4fCpQUcanTDlcOcQQNuw7LDnC3DryEwIcKIwo3DhsKbYsOXw7fCm35Pwrh/wrDDsy3DjhAkbxFlNSzCnxZJw4VEUsKzwr4tCHPDi8OWw5vDok4lSU1uGsKiw7HDmMOQLcK5VsOTwqfCtibDp1zCvyEwIcK3wq0Bwp8PVC1GEiExNjAhQQMDTcK/w5Q+w40Gw77CmyRCLUtndcK1MAbCusKCF8OVUMO3w7dMej4twro1w5wCw5jDoRwhMTYwIcK9wpJKYSE0NSEhOSERZC1UwpbDm07DpMOuwoY1wqXCpMKJITQ1IcKew6N/wpMtB8KBd2x5w7vDtnkaAcKEwqVvwqN9wrAtITExIVXDhMKmFcOPwpLCi8Kow5DDgcOtXUUuYC3DljVBe0lwNiExMyHDjcOLwrshMTIhwprCkcOjSC1Ww5Yjw6jCu8OlwqXDr1chMTYwIcKiITM5IVR+bwQtSD3ChcKQCFLCiMOMITAhMsKVRsOZITAhITAhwpAtwrpzRsOIVz/CrFshMzkhGcKfRcOVwpPCqD0tZcKpw5Iyw6xga8KHHMODbUnCpsOowqnDlS3Ch8OLw5ghMTYwIVjDnsKCBUgpUA7DhDHCrmwtw58rwqQDbMO7bsOHScKJeCEzOSHCvcKDPFwtw4NwLMK1w7w5w7fCvwTDkTshNDUhGinCqX0tYUxgfUnDqMOlwqFwP8KyYMKZw4HDssODLcOjwqXDkMKxQDfDrMOqw43Cm3DDr8O9wqrCrV4tw5DDg8OpPncrKXPDncK5w6vDg0shMTMhw5/Cgi3DmCEzMyHCqjnCssKKw6vDvELCrcOSw5LCjyE0NSFAbi3Dk8K1w6bCr0cSaUfCpCExMiFbw4A6wqbDrcKsLcOXwofCh1LChMK+w7YPT8OuwpPCiSExMSHCocOtwrUtEEXDiy4Bw6x8LsOlw4FBfB8+wrrDkC1iaywmITQ1IcOgAcK5ITMzIcKfVH/CssKRw4sGLcKQKXbCgMO7ITkhwqfCs8Kjw47DrsOZw5VTQMO4LXU7wrHDmDUhMTYwIcKaYMODHcKYQ8O4T8Orw6Ytw514w57Cp8ODw4LCgsK0XXfDiMKFwpXCqGXDpy0HwrPCrzEOfMKXS8Olwp57L8OcZcOWai3CvMKqaMKyw6gWQF8ewpLDvsOYFzwSby3DgSEzNCFywr5lHlbDt8O8w7zCmsOswr8Ra8KELWBIwpxOITEwIXrDmkEww5diwpTClQERbS0cfsKlXMK8QcKFw7XDjcKRITExIcKDDxvCgHQtRcKJR8KLwo4hMzQhEzjDkcOWw73DrcKXwofDjGUtT8K1fwPCq8OIDl9Aw7LDokjCmj53w6gtw7LCscKEwqtNe8OYwrV0w5FHPH3DhMOqNy3DksKpw47DtX4gwq9uHCohMTIhbyvDs3HCuC3Co8K4ORXCmMOYwqXCiU/DgsKWw4BRLsONwpQtbiE0NSHDmEY+bsKlJcOmc8KPD8KKDsKPw5Itw7vDvMKeasKPwqTDojQpORRXdsKww4ZFLcKcw6lKwpMhMCEhMTYwIcKfwrvDvVDDtFtjcMOswrEtesKawoRAw6zDusK7woAow6nCmMObw5cfwpTCsy12FsOPwpfDrcONesKCw7PDl2ohMTYwIQ7CqMOZei3CgnMhMTIhw7tBIMKRAnpULCExNjAhMSDClV8twrIGG3PDtB3CssOFwpbDq8KrwpV3w54Uw4MtfsOZHl/Ct8KMWnHCu8OAAsKiS0XCosKSLcKINcKjHmfDoxohMzkhKcKZwrxgw7kCJDstwr5BITQ1IRIIDsOCwpTDqMObw57DicOuXld/LQUYw7bCp8O8D2rDjSExMyHCj8Oawo/DpMOUITM0IVMtw5LDtHs0wohkb2QpwoM8KMObwrYhMzkhw6wtesOkOVM+B0dbDip7BFfCh8OQFS3DgV4Gw5hUw5XDqCEzMyHDnwfCj8ONw5vCj8Kiwq4tw6nChDHCncO9HsOHfmkfP2YHw63DsCAtw5clWMK3KMOjSMKbw787w4zCnsK7O0/DuC1rworDkCNlYcO9wp/CtMK8wrzCrVrCpSNXLWLDlHUhMzMhwq3DkcKjw4HCl8Ofw4zCukcCw7ZeLTHClXTDviEzOSHCsMOvwq5NLDJsw6kGwpQhMTYwIS0hMzQhwpLCjsOuGcKxwpfDlsOMw4vCmsOUwofDvTHDuS0qw43DgMKNW2zDtMKnwovDgcKWEcKAY33DhS0hMzQhw5ABw5shMzQhwonCucKpb8OYwr/Cs8O0ITMzIcKhwogtw7LDgHnCrMOIWQJNITM0IcOyP8OkBcODw4AjLXUCWMOkOMKYw7JUd2/DrcOvcwbCu20td8OmNGlPZMK1woE2VEN7BGTCqW4tw4oXFsOEwrIgwoDDoX8/NMOjaUQQw60tSMOvwrnDsBLCrzxoJH3CsMKzHXHDoW0tBCBoXU1zITQ1ITx1R8Oowps4w6HDkMKpLcOif8OLw5DCtg/DiB7CqMOLUwbDisKdN3wtJMOpdX8kwrvCiyrCjcKGRsOFw5rCv8KUw6UtwrnCjQTDt0YTw4XDuGnCghnDiX/DrEk9LcKkw73ChMKAw7rCnT7DkcOtOMKKKcOwwr0aw6Etw7JUQwbDsMKBw6zDjMOmwrFdw6FRdREULSzDklNgw6HCvMOEWMKWXkzCmcKafcO1wqotGQVRZMO/wqLCsMOqPcKtwq/CvyExNjAhwrDDk8KVLSsqfDHDscKkwoZGw6paZMKnw7t/A8KYLcOcw796wrvCr3EhMTEhw6rCscOew63DmjjClGV6LcOlw4cfHgXCnl4lwp3Cq1c8w7QzwoByLcOFw5nCn3jDgmZkw6rCqnQfEVPClMK6Ay3ClXUbMVjCssKDwrYpwrTCqMKMw7EVE30twoHCo8OyITAhw7N5BUp7W3bDlsOeJsKjwrAtdsKcX8K2wojDqRfCuX9MwrTDhMOZKlAzLTNFw4Zww6ZjEsODOFvDukbDp2DDusKHLcOyw63DsMK4w5AdITQ1ISAPcAfDhMOtFGY1LcKZdsKzw7QHw5vCnghgw7HCpMOyPhvCpQ8tSWjCviEwISEwIRfCviE5IVZXBxhmUUFKLSE5IcOMDjbCsSExMCHCvTVQwo7DtsKvw73CicOLw4wtecKXES4yGTlEwpcWZ8O8ITkhFsKHZi0oeFvDlMORwpchOSElcCEwIcOgemfDu8Kow6stwqjDqsKAWgEhOSHDqT02wohKUTo9wrXDuy1Bw7DCjcKWw7oYMcKaMcKEw5xiRU9GUS0hMTIhw6/CrMKOdAjCqSExNjAhw6vDuMOBw5kSwq8Xwpgtw7vDoHTDqsOFwqrDkMOXMsONMVfDsH/CrWktByExNjAhL8OBwpLDqhNnwpNmNcKfNsKow4d3LRPCjyoSe2DDvDvCvxt9wpYPe0dwLcKnw78hMzMhw5NkwqLDkkg5aSExMyHDtQfCpsOpKi0uQsKSw6PCh8OQw559w4PChsO8wrE/wqLDuBUtwoBwXCEwITHCrcOlwodzwptlwoFSw5jClnQtw7HCkCExMCE5cUvClcO+AcOuITMzIUzCrcKpYy8tw6PCuMKPwrrDtBHDtzE+wqpzw7RiBBRvLTnDscOKwq3Cn2A1aMORL2YjSMObITAhJC1lV8K9wq9qwr3Dq8KUUyPDnEzDvcOIVcO8LcO4w4zDpT0Uwog0w4wgwqopOi7CmCZqLcOwN8OdSVJiw7DDmCEwITxgSsOJVjF0LcOsw5Nkw74xworCk8O/w6nChURmcMO/wrssLRDDvlpAwqU9c8KGOcOjwq5zB8KsRxUtETJIwo/DoXo5YVxqcWjDpsKhw71MLcOKCELCrsKswpAgw5Ngw5gUN8KPwqlHEi0Fey9IITEzIU83w7DDqcObwpJtwrJqDsOlLcKAw5EhOSFywq/DtcKvWsO/wp3CksOITMK/cMOqLcOywpFNAsKpasKrZA/ClMO7e8O3YSExMiHCvS0FITEyIcOTAg5AITE2MCEOFDfCkSExMSFOITMzIWxeLUpaw7Bww4NtasOWw6JawrfCh8OvwofCmA==
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日 星期二
[C#] [Html AgilityPack] 解析HTML 抓取台灣銀行外匯資料
MVC 架構 當練習 隨便寫寫 有點亂...
功能:
1.抓取外匯資料
2.預設顯示 美金 英鎊 日圓 RMB
3.可供選顯示/隱藏 其他外幣資料
功能:
1.抓取外匯資料
2.預設顯示 美金 英鎊 日圓 RMB
3.可供選顯示/隱藏 其他外幣資料
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public ActionResult Index() | |
{ | |
string strUrl = "http://rate.bot.com.tw/Pages/Static/UIP003.zh-TW.htm"; | |
//Html AgilityPack | |
WebClient client = new WebClient(); | |
currency currency = new currency(); | |
using (MemoryStream ms = new MemoryStream(client.DownloadData(strUrl))) | |
{ | |
HtmlDocument doc = new HtmlDocument(); | |
doc.Load(ms, Encoding.UTF8); | |
// 取得所有符合條件的nodes | |
HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//table[2]/tr[@class='color0' or @class='color1' ]");///tr[contains(@class='color0')] td[@class='titleLeft'] | |
currency.dtCurrency = new DataTable(); | |
currency.dtCurrency.Columns.Add("幣別"); | |
currency.dtCurrency.Columns.Add("買入"); | |
currency.dtCurrency.Columns.Add("賣出"); | |
currency.NewTime = doc.DocumentNode.SelectSingleNode("//div[@class='entry-content']/table/tr/td[2]").InnerText.Trim().Replace("\r\n", "").Replace(" ",""); | |
List<CheckBoxes> CurrencyType = new List<CheckBoxes>(); | |
foreach (HtmlNode node in nodes) | |
{ | |
DataRow r = currency.dtCurrency.NewRow(); | |
r[0] = node.SelectSingleNode("td[@class='titleLeft']").InnerText.Replace(" ",""); | |
if (r[0].ToString() == "美金 (USD)" || r[0].ToString() == "英鎊 (GBP)" || r[0].ToString() == "日圓 (JPY)" || r[0].ToString() == "人民幣(CNY)") | |
{ | |
CurrencyType.Add(new CheckBoxes() | |
{ | |
Text = r[0].ToString(), | |
Checked = true | |
}); | |
}else | |
{ | |
CurrencyType.Add(new CheckBoxes() | |
{ | |
Text = r[0].ToString(), | |
Checked = false | |
}); | |
} | |
r[1] = node.SelectSingleNode("td[3]").InnerText; | |
r[2] = node.SelectSingleNode("td[4]").InnerText; | |
currency.dtCurrency.Rows.Add(r); | |
currency.CurrencyType = CurrencyType; | |
} | |
} | |
return View(currency); | |
} | |
public class CheckBoxes | |
{ | |
public string Text { get; set; } | |
public bool Checked { get; set; } | |
} | |
public class currency | |
{ | |
public string Name { get; set; } | |
public double buy { get; set; } | |
public double sale { get; set; } | |
public List<CheckBoxes> CurrencyType { get; set; } | |
public string NewTime{ get; set; } | |
public DataTable dtCurrency { get; set; } | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@model AfternoonTea.Models.currency | |
@{ | |
ViewBag.Title = "Home Page"; | |
int count = 0; | |
} | |
<div class="jumbotron"> | |
<h1>台灣銀行-外幣匯率 </h1> | |
</div> | |
<section class="content"> | |
<div class="row"> | |
<div class="col-xs-12"> | |
<div class="box box-solid"> | |
<div class="row pad"> | |
<div class="label label-primary"> | |
<input type="checkbox" id="All" name="All" class="checkbox-inline" style="width:20px;height:20px;position:relative;top:-2px;" /><label style="font-size:20px;margin-right:10px;padding:3px;">All </label> | |
</div> | |
<br /> | |
@for (int i = 0; i < Model.CurrencyType.Count; i++) | |
{ | |
<div class="label label-success" style="margin-right:10px;margin-bottom:3px;padding:5px;"> | |
<input type="checkbox" id="ck_@i" name="currency" value="@Model.CurrencyType[i].Text" class="ck_list checkbox-inline" style="width:20px;height:20px;position:relative;top:-2px;" checked="@Model.CurrencyType[i].Checked" /> | |
<label style="font-size:20px;padding:5px;">@Model.CurrencyType[i].Text.PadRight(9, ' ')</label> | |
</div> | |
//@Html.CheckBoxFor(m => m.CurrencyType[i].Text, new { Class = "ck_list", id = string.Format("ck_{0}", i) }) | |
if (i!=0 && i%5 == 0) { <br />} | |
} | |
<br /> | |
</div> | |
</div> | |
</div> | |
</div> | |
</section> | |
<div class="row"> | |
<h3 class="label-default" style="color:white">@Model.NewTime</h3> | |
<table class="table table-bordered table-hover"> | |
<thead> | |
<tr> | |
<th>幣別</th> | |
<th>買入</th> | |
<th>賣出</th> | |
</tr> | |
</thead> | |
@foreach (System.Data.DataRow item in Model.dtCurrency.Rows) | |
{ | |
string hide = "display:none;"; | |
if (count == 0 || count == 2 || count == 7 || count == 18 ) | |
{ | |
hide = ""; | |
} | |
<tr id="row_@count" class="currencyRow" style="@hide"> | |
<td>@item[0]</td> | |
<td>@item[1]</td> | |
<td>@item[2]</td> | |
</tr> | |
count++; | |
} | |
</table> | |
</div> | |
<script type="text/javascript"> | |
$(function (){ | |
$("#All").click(function(){ | |
if($("#All").prop("checked")) | |
{ | |
$(".ck_list").prop("checked",false); | |
$(".currencyRow").removeAttr("style"); | |
}else | |
{ | |
$(this).prop("checked",false); | |
$(".currencyRow").attr("style","display:none;"); | |
$("#ckStatus").val("All"); | |
} | |
}); | |
$(".ck_list").on("change", function () { | |
var row = $(this).attr("id").substring(3); | |
var count = @Model.CurrencyType.Count; | |
console.log(row); | |
if ($(this).prop("checked")) | |
{ | |
$("#row_" + row).removeAttr("style"); | |
}else | |
{ | |
$("#row_" + row).attr("style", "display:none;"); | |
} | |
if ($(".ck_list").is(":checked").length == count) | |
{ | |
$("#All").prop("checked", true); | |
}else | |
{ | |
$("#All").removeAttr("checked"); | |
} | |
}); | |
}); | |
</script> |
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日 星期三
[AngularJS] 禮品清單

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html xmlns="http://www.w3.org/1999/xhtml" ng-app="app"> | |
<head runat="server"> | |
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> | |
<link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/2.3.2/css/bootstrap.min.css"> | |
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0rc1/angular.min.js"></script> | |
<title></title> | |
<script type="text/javascript"> | |
var app = angular.module('app', []); | |
app.controller('GiftCtrl', function ($scope, $http) { | |
$scope.giftList = [ | |
{ item: 'item1', gift: 'GIFT' }, { item: 'item2', gift: 'GIFT' }, | |
{ item: 'item3', gift: 'GIFT' }, { item: 'item4', gift: 'GIFT' }, | |
{ item: 'item5', gift: 'GIFT' }, { item: 'item6', gift: 'GIFT' }, | |
{ item: 'item7', gift: 'GIFT' }, { item: 'item8', gift: 'GIFT' } | |
]; | |
$scope.giftList2 = [ | |
{ item: 'item1', gift: 'GIFT' }, { item: 'item2', gift: 'GIFT' }, | |
{ item: 'item3', gift: 'GIFT' }, { item: 'item4', gift: 'GIFT' }, | |
{ item: 'item5', gift: 'GIFT' }, { item: 'item6', gift: 'GIFT' }, | |
{ item: 'item7', gift: 'GIFT' }, { item: 'item8', gift: 'GIFT' } | |
]; | |
}); | |
$scope.whatColorIsIt = function (index) { | |
if(index % 2 == 0) | |
{ | |
return "azure"; | |
} | |
else { | |
return "emerald"; | |
} | |
} | |
</script> | |
<style type="text/css"> | |
#container { text-align: center; margin: 20px; } | |
h1{ | |
color: #e50; | |
text-shadow: 0 2px white; | |
text-align: center; | |
margin-top: 10px; | |
/*color: white;*/ | |
} | |
a { text-decoration: none; color: #EC5C93; } | |
.bar-main-container { | |
margin: 10px auto; | |
width: 500px; | |
height: 80px; | |
-webkit-border-radius: 4px; | |
-moz-border-radius: 4px; | |
border-radius: 4px; | |
font-family: sans-serif; | |
font-weight: normal; | |
font-size: 0.8em; | |
color: #FFF; | |
} | |
.wrap { | |
padding: 8px; | |
text-align: center; | |
box-sizing: border-box; | |
} | |
.bar-percentage { | |
float: left; | |
background: rgba(0,0,0,0.13); | |
-webkit-border-radius: 4px; | |
-moz-border-radius: 4px; | |
border-radius: 4px; | |
padding: 13px 14px 12px 10px; | |
width: 20%; | |
height: 30px; | |
margin-top: 5px; | |
/*margin-right: 10px;*/ | |
} | |
.bar-container { | |
float: right; | |
-webkit-border-radius: 10px; | |
-moz-border-radius: 10px; | |
border-radius: 10px; | |
height: 10px; | |
background: rgba(0,0,0,0.13); | |
width: 78%; | |
margin: 12px 0px; | |
overflow: hidden; | |
line-height: initial; | |
} | |
.itemFont{ | |
margin-left:10px; | |
font-size:20px; | |
line-height: initial; | |
} | |
.giftFont { | |
color:white; | |
font-size:24px; | |
line-height: initial; | |
margin-left:10px; | |
} | |
.img { | |
background-color:#EFC32F ; /*#026873*/ | |
background-image: linear-gradient(90deg, rgba(255,255,255,.07) 50%, transparent 50%), | |
linear-gradient(90deg, rgba(255,255,255,.13) 50%, transparent 50%), | |
linear-gradient(90deg, transparent 50%, rgba(255,255,255,.17) 50%), | |
linear-gradient(90deg, transparent 50%, rgba(255,255,255,.19) 50%); | |
background-size: 13px, 29px, 37px, 53px; | |
} | |
.check { | |
background-color: #9c9; /*E4B363*/ | |
background-image: -webkit-gradient( linear, left top, left bottom, from(rgba(255,255,255, .1)), color-stop(.5, rgba(255,255,255, .1)), color-stop(.5, rgba( 0, 0, 0, .1)), to(rgba( 0, 0, 0, .1))), -webkit-gradient( linear, left top, right top, from(rgba(255,255,255, .1)), color-stop(.5, rgba(255,255,255, .1)), color-stop(.5, rgba( 0, 0, 0, .1)), to(rgba( 0, 0, 0, .1))); | |
background-image: -moz-linear-gradient( top, rgba(255,255,255, .1) 0, rgba(255,255,255, .1) 50%, rgba( 0, 0, 0, .1) 50%, rgba( 0, 0, 0, .1) 100%), -moz-linear-gradient( left, rgba(255,255,255, .1) 0, rgba(255,255,255, .1) 50%, rgba( 0, 0, 0, .1) 50%, rgba( 0, 0, 0, .1) 100%); | |
background-size: 8px 8px; | |
-webkit-background-size: 8px 8px; | |
-moz-background-size: 8px 8px; | |
} | |
/* COLORS */ | |
.azure { background: #38B1CC; } | |
.emerald { background: #2CB299; } | |
.violet { background: #8E5D9F; } | |
.yellow { background: #EFC32F; } | |
.red { background: #E44C41; } | |
</style> | |
</head> | |
<body class="img"> | |
<form id="form1" runat="server"> | |
<div> | |
<h1 >禮品清單</h1> | |
</div> | |
<div> | |
<div class="well span7 check " style="margin-top:20px;" ng-controller="GiftCtrl"> | |
<div ng-repeat="g in giftList" id="bar-2" class="bar-main-container" ng-class="{{$index}} % 2 == 0 ? 'azure' :'red'"> | |
<div class="wrap"> | |
<div class="bar-percentage" > | |
<span class="itemFont">{{g.item}}</span> | |
</div> | |
<span class="giftFont">{{g.gift}}{{$index+1}}</span> | |
</div> | |
</div> | |
</div> | |
<div class="well span7 check" style="margin-top:20px;" ng-controller="GiftCtrl"> | |
<div ng-repeat="g2 in giftList2" id="bar-2" class="bar-main-container" ng-class="{{$index}} % 2 == 0 ? 'red' :'azure'"> | |
<div class="wrap"> | |
<div class="bar-percentage" > | |
<span class="itemFont" >{{g2.item}}</span> | |
</div> | |
<span class="giftFont">{{g2.gift}}{{$index+1}}</span> | |
</div> | |
</div> | |
</div> | |
</form> | |
</body> | |
</html> |
2016年1月19日 星期二
2016年1月10日 星期日
[C#]DataTable select 條件搜尋和排序
塞選出 Name = Ash , 用ID和Age 做排序
- DataRow[] tmp = MyDataTable.Select("Name='Ash' ", "ID,Age");
2016年1月8日 星期五
[Android] WallpaperManager 設定桌布
簡單記錄一下 我有實作的部分
按下設成桌布就完成了... 儲存圖片的功能+設定桌布完整版的CODE
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
setPaperWell.setOnClickListener(new View.OnClickListener() { | |
@Override | |
public void onClick(View view) { | |
WallpaperManager wallpaperManager = WallpaperManager.getInstance(getActivity().getApplicationContext()); | |
//imageView 轉 Bitmap | |
//ImageView iv = (ImageView) getActivity().findViewById(R.id.imageView); | |
try { | |
//wallpaperManager.setBitmap(iv.getDrawingCache()); | |
wallpaperManager.setResource(select); | |
Toast.makeText(getActivity(), "桌布設定成功!", Toast.LENGTH_SHORT).show(); | |
} | |
catch(IOException e) | |
{ | |
e.printStackTrace(); | |
Toast.makeText(getActivity(), "Wallpaper error!", Toast.LENGTH_SHORT).show(); | |
} | |
} | |
}); |
按下設成桌布就完成了... 儲存圖片的功能+設定桌布完整版的CODE
2016年1月6日 星期三
[MVC]CheckBox複選、全選、取消
我忘了有沒有寫過類似的東西
剛好今天有空,索性整理一下吧
JQUERY
Checkbox是長這樣的
<input type="checkbox" value="1" @checkList[1]><label>AA</label>
Controller
接到勾選的Tab後,去DB搜尋
之前寫的不太簡潔,順帶記錄一下新寫法
JQUERY
View 順便講一下好了,checkList 這個是用來記錄CheckBox選取的狀態 MVC 才可以這樣用......
- // 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");
- }
- });
- //這段程式碼可以不用理他,是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")
- {
- List
TagCondition = 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)