2016年12月26日 星期一

[IOS] Progress View



@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月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月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 一些欄位 就可以了)

//狀況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

實作並完成項目
  • 分頁Tag切換
  • 樣本圖片(首頁) 圖片輪播
  • 定單 按鈕聯結browser分頁
  • 寫真 PhotoGrid 點照片可看全圖
  • Photo可儲存、可設成桌布
  • 問與答 資訊開合呈現
聊天 可登入設定暱稱加入聊天 可以呈現歷史訊息 發送聊天訊息 管理員(特定帳號)可發公告
但那時候寫的時候方法想錯了
所以聊天沒做好(訊息接收呈現什麼的...)


請輸入密碼 可看完整截圖 (提示:萬年4碼生日)

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

2016年6月15日 星期三

[SQL] Datediff 算出時間間隔

例子昰 刪除 超過10分鐘的資料

會用到 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.可供選顯示/隱藏 其他外幣資料


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應用程式


填入資料 按建立


設定部屬認證 

這裡填入的帳號密碼,是若使用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

      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
發了此篇,以謹記在心
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
       function ImageArea(){
            $('img#imgCut').imgAreaSelect({
                handles: true, //是否出現小方塊 易於拖拉
                aspectRatio: "1:1", //比例
                x1: 0, y1: 0, x2: 100, y2: 100, //預設選取區塊
                onSelectChange: preview //及時預覽
                //onSelectEnd: someFunction
            });
        };

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月16日 星期三

[Visual Studio 2015] 壓力測試



步驟教學

介紹壓力測試

如何找到已經測過的測試報告

1.在負載測試的頁面上,按下 [開啟和管理負載測試結果]




2.選擇你要的測試結果,按下 [開啟]

2016年3月14日 星期一

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








巨業客運 官網

清水鬼洞 地址:台中市清水區鰲峰山公園北側
【清水區公所】洽詢電話: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; 就行了


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月4日 星期四

[Android] TextView 文字置中



android:gravity="center_horizontal"

[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月19日 星期二

2016年1月10日 星期日

2016年1月6日 星期三

[MVC]CheckBox複選、全選、取消

我忘了有沒有寫過類似的東西 剛好今天有空,索性整理一下吧
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") 
{
  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));
}