2016年12月26日 星期一

[IOS] Progress View



  1. @IBOutlet weak var btnStart: UIButton!
  2. @IBOutlet weak var progress: UIProgressView!
  3. @IBOutlet weak var labelMsg: UILabel!
  4. //計時器
  5. var timer: Timer?
  6. //計數
  7. var count : Int = 0
  8. override func viewDidLoad() {
  9. super.viewDidLoad()
  10. progress.frame.size.width = 250
  11. //可以自訂progress顏色
  12. progress.progressTintColor = UIColor.red
  13. progress.trackTintColor = UIColor.darkGray
  14. progress.progress = 0
  15. }
  16.  
  17. @IBAction func donloadClick(_ sender: UIButton) {
  18. //按鈕失效 避免重複點擊
  19. btnStart.isEnabled = false
  20. count = 0
  21. //參數順序亂掉會報錯
  22. //The runTimedCode selector means that the timer will call a method named runTimedCode() every 0.5 seconds until the timer is terminated
  23. timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector:#selector(runTimedCode), userInfo: nil, repeats: true)
  24. }
  25. func runTimedCode() {
  26. progress.progress = Float(count) / 100
  27. labelMsg.text = "process: \(count)%"
  28. count += 1
  29. if count > 100 {
  30. timer!.invalidate() // stop
  31. timer = nil
  32. btnStart.isEnabled = true
  33. }
  34. }
  35.  
參考資料:hackingwithswift.com

2016年12月15日 星期四

[IOS] ImageView 翻圖片


裡面有用到兩種不同Array寫法來存圖片





  1. class ViewController: UIViewController {
  2. @IBOutlet weak var btnPre: UIButton!
  3. @IBOutlet weak var btnNext: UIButton!
  4. @IBOutlet weak var labelName: UILabel!
  5. @IBOutlet weak var image: UIImageView!
  6. //兩種array方法
  7. var arrayImage = ["水上威尼斯","史特拉斯堡-2","科瑪", "新天鵝堡_繽紛","春露"]
  8. var pic: [UIImage] = [
  9. UIImage(named: "水上威尼斯")!,
  10. UIImage(named: "史特拉斯堡-2")!,
  11. UIImage(named: "科瑪")!,
  12. UIImage(named: "新天鵝堡_繽紛")!,
  13. UIImage(named: "春露")!
  14. ]
  15. var current:Int = 0
  16. var count:Int = 0
  17. override func viewDidLoad() {
  18. super.viewDidLoad()
  19. count = arrayImage.count
  20. //image.image = UIImage(named: "水上威尼斯")
  21. image.image = pic[0]
  22. labelName.text = arrayImage[0]
  23. }
  24.  
  25. @IBAction func preClick(_ sender: UIButton) {
  26. current -= 1
  27. if current < 0 {
  28. current = count - 1
  29. }
  30. //image.image = UIImage(named:String(arrayImage[current]))
  31. image.image = pic[current]
  32. labelName.text = arrayImage[current]
  33. }
  34. @IBAction func nextClick(_ sender: UIButton) {
  35. current += 1
  36. if current == count {
  37. current = 0
  38. }
  39. //image.image = UIImage(named:String(arrayImage[current]))
  40. image.image = pic[current]
  41.  
  42. labelName.text = arrayImage[current]
  43.  
  44. }
  45. override func didReceiveMemoryWarning() {
  46. super.didReceiveMemoryWarning()
  47. }
  48. }










[IOS] 自訂生成按鈕(CustomButton)


範例是在書上看到的,不過程式碼我有改過,因為Swift 3 出來了,而市面書上的範例程式碼... 你懂的

這篇主要是講後端生成程式碼 以Button為例

  1. yourButtonName.addTarget(self, action:#selector(functionName(sender:)), for: .touchUpInside)
  2. fun functionName(sender:UIButton) {
  3. //....
  4. }

action 這邊 如果沒有回傳值 (sender:) 就不用加了


View 的截圖 自訂12個按鈕


Controller全部程式碼

  1. class ViewController: UIViewController {
  2.  
  3. @IBOutlet weak var labelTel: UITextField!
  4. @IBOutlet weak var labelMsg: UILabel!
  5. override func viewDidLoad() {
  6. super.viewDidLoad()
  7. for i in 0...11 {
  8. let x:Int = 100 + (i % 4) * 60
  9. let y:Int = 140 + (i / 4) * 60
  10. let buttonNumber:UIButton = UIButton(type: UIButtonType.system) as UIButton
  11. //按鈕位置 大小
  12. buttonNumber.frame = CGRect(x: x,y: y,width: 40, height: 35)
  13. //文字顏色
  14. buttonNumber.setTitleColor(UIColor.white, for: UIControlState.normal)
  15. //按鈕背景
  16. buttonNumber.backgroundColor = UIColor.black
  17. //字型大小
  18. buttonNumber.titleLabel?.font = UIFont(name: "System", size: 22.0)
  19. if i == 10 {
  20. buttonNumber.setTitle("X", for: UIControlState.normal)
  21. //加入事件 #selector(funcName(sender:)) 函數是有參數的
  22. buttonNumber.addTarget(self, action:#selector(clearClick(sender:)), for: .touchUpInside)
  23. } else if i == 11 {
  24. buttonNumber.setTitle("OK", for: UIControlState.normal)
  25. buttonNumber.addTarget(self, action:#selector(sureClick(sender:)), for: UIControlEvents.touchUpInside)
  26. }else {
  27. buttonNumber.setTitle("\(i)", for: UIControlState.normal)
  28. buttonNumber.addTarget(self, action:#selector(numberClick(sender:)), for: UIControlEvents.touchUpInside)
  29. }
  30. //加入按鈕
  31. view.addSubview(buttonNumber)
  32. }
  33. }
  34.  
  35. func sureClick(sender:UIButton) {
  36. if labelTel.text?.lengthOfBytes(using: String.Encoding.utf8) == 10 {
  37. labelMsg.text = "Call " + labelTel.text!
  38. } else if labelTel.text == "" {
  39. labelMsg.text = "Please enter your phone number."
  40. } else if (labelTel.text?.lengthOfBytes(using: String.Encoding.utf8))! > 10{
  41. labelMsg.text = "Error"
  42. }
  43. }
  44. func clearClick(sender:UIButton){
  45. labelTel.text = ""
  46. labelMsg.text = ""
  47. }
  48. func numberClick(sender:UIButton) {
  49. labelTel.text = labelTel.text! + sender.currentTitle!
  50. }
  51. override func didReceiveMemoryWarning() {
  52. super.didReceiveMemoryWarning()
  53. // Dispose of any resources that can be recreated.
  54. }
  55.  
  56.  
  57. }

2016年10月11日 星期二

[IOS] Rotation & Scale


這是在網路上找的教學

照著做了N遍......有些小疏漏,錯了就重來再重來這樣

確保自己可以記住QQ


想說以後弄個桌遊APP出來的時後 可以不用這麼辛苦

總之 這算是為了往後的作品做的前期準備吧XD






2016年8月8日 星期一

[Chrome] Notification 通知視窗




  1. window.addEventListener('load', function () {
  2. //確認使用者是否允許跳窗,如果沒有,就跳窗取權限
  3. if (window.Notification && Notification.permission !== "granted") {
  4. Notification.requestPermission(function (status) {
  5. if (Notification.permission !== status) {
  6. Notification.permission = status;
  7. }
  8. });
  9. }
  10. function NotifyMsg() {
  11. var option = {
  12. tag: 'Notification',
  13. body: '測試測試測試',
  14. data: 'I am a data',
  15. icon: '' //可以自訂ICON
  16. }
  17.  
  18. var n = new Notification("Title", option);
  19. setTimeout(n.close.bind(n), 5000);
  20. console.log(n.data);
  21. n.onclick = function (event) {
  22. event.preventDefault(); // prevent the browser from focusing the Notification's tab
  23. window.open('http://www.google.com.tw/', '_blank');
  24. }
  25. }
  26.  
  27. var button = document.getElementsByTagName('button')[0];
  28. button.addEventListener('click', function () {
  29. // If the user agreed to get notified
  30. // Let's try to send ten notifications
  31. if (window.Notification && Notification.permission === "granted") {
  32. NotifyMsg();
  33. }
  34.  
  35. // If the user hasn't told if he wants to be notified or not
  36. // Note: because of Chrome, we are not sure the permission property
  37. // is set, therefore it's unsafe to check for the "default" value.
  38. else if (window.Notification && Notification.permission !== "denied") {
  39. Notification.requestPermission(function (status) {
  40. if (status === "granted") {
  41. NotifyMsg();
  42. }
  43. // Otherwise, we can fallback to a regular modal alert
  44. else {
  45. alert("Hi!");
  46. }
  47. });
  48. }
  49. // If the user refuses to get notified
  50. else {
  51. // We can fallback to a regular modal alert
  52. alert("Hi!");
  53. }
  54. });
  55. });



參考資料: MDN


2016年8月3日 星期三

[JQuery] slideShow 輪播

記錄一下 好用的輪播套件 slick 連結

然後下面範例是拿其他教學範例多加的功能

在特定的高度上會停止撥放幻燈片

  1. $(document).ready(function (){
  2. //window.scroll 抓取使用者滾輪高度..這裡自訂600
  3. var stop = false;
  4. $(window).scroll(function () {
  5. var scrollTop = $(window).scrollTop();
  6. if (scrollTop >= 600 ) {
  7. console.log("stop" + scrollTop);
  8. stop = true;
  9. } else {
  10. console.log("r" + scrollTop);
  11. stop = false;
  12. }
  13. });
  14.  
  15. var num = 1;
  16. var tNum = 5;
  17. var duration = 2000;
  18. console.log("A");
  19.  
  20. run();
  21. $("#box").mouseover(function () { stopRun(); })
  22. .mouseout(function () { run();})
  23. for (var i = 1; i <= tNum; i++) {
  24. document.getElementById("tab" + i).onclick = show;
  25. document.getElementById("con" + i).style.display = "none";
  26. }
  27. document.getElementById("con1").style.display = "block";
  28. document.getElementById("tab1").className = "now-tab";
  29.  
  30. //在 autoShow 判斷是否停止撥放
  31. function autoShow() {
  32. if (stop) return;
  33.  
  34. for (var i = 1; i <= tNum; i++) {
  35. document.getElementById("con" + i).style.display = "none";
  36. document.getElementById("tab" + i).className = "";
  37. }
  38. if (num < tNum) { num++; } else { num = 1; }
  39. document.getElementById("con" + num).style.display = "block";
  40. document.getElementById("tab" + num).className = "now-tab";
  41.  
  42. }
  43.  
  44. function show() {
  45. num = this.id.substr(3) - 1;
  46. autoShow();
  47. }
  48.  
  49. function stopRun() { clearInterval(myInterval); }
  50.  
  51. function run() { myInterval = setInterval(autoShow, duration); }
  52. });
來源:Flycan-輪播廣告 教學

2016年7月28日 星期四

[SQL] 暫存表 Temporary Tables

最近遇到一些情況

都是可以用到暫存表去解決的

偏偏以前從沒機會使用過(也沒聽過 XD)

感謝同事幫忙  >_<


狀況 1. 搜尋出來的資料量太大,EXCEL沒辦法全部貼上

---> 把資料撈進暫存表 再從暫存表下條件慢慢撈~~

狀況2. 依照EXCEL上的資料順序 去撈取資料, 再把撈到的資料貼到EXCEL上

  ---> 所以先把EXCEL的資料建表 order by 一些欄位 就可以了)

  1. //狀況1
  2. select email
  3. into #tempMail
  4. from member with(nolock)
  5. where ..some conditions
  6.  
  7. SELECT * FROM #tempMail WHERE email LIKE 'A%' ORDER BY email
  8.  
  9. //狀況2
  10. //暫存表的建法 是在table名稱前加上 #
  11. create table #tmp_table (return_id nvarchar(30) , pid nvarchar(20))
  12.  
  13. //建完後insert資料
  14. insert into #tmp_table(return_id ,pid) values('XXXXXX','YYYY')




[SQL] 依照 in 來排序


  1. // 這裡是用 ,pid, 當作排序依據 charindex(exp1,exp2)會回傳exp1所在的位置,起始值是1
  2. select pid,name
  3. from temp
  4. where pid in ('p004','p008','p435','p123','p056')
  5. order by charindex(',' + cast(pid as varchar(10) + ',' , ',p004','p008','p435','p123','p056,' ))


  1. //如果排序的對象有空白(不管空白是在字串前或後) 可以用 rtrim() 來Trim掉空白
  2. select rtrim(pid),name
  3. from temp
  4. where pid in ('p004','p008','p435','p123','p056')
  5. order by charindex(',' + rtrim(cast(pid as varchar(10)) + ',' , ',p004','p008','p435','p123','p056,' ))
  6.  

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() 連結兩個以上的字串


  1. //EX1
  2. SELECT CONCAT(Country , + ',' + City , + ',' + Zip) as address
  3. FROM Table
  4.  
  5. //Ex2
  6. SELECT Country ',' + City + ',' + Zip as address
  7. FROM Table
  8.  

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) 昰用來計算時間的間隔,會回傳正負整數

  1. DELETE FROM [Table] WHERE (
  2. SELECT ID FROM [Table] WHERE DATEDIFF(minute,CreateTime,getdate()) > 10
  3. )
  4.  
  5. --順便塞一下 SQL 算出這個月的最後一天
  6. SELECT DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE() ), -1)

2016年6月7日 星期二

[C#] [Html AgilityPack] 解析HTML 抓取台灣銀行外匯資料

MVC 架構 當練習 隨便寫寫 有點亂...

功能:
1.抓取外匯資料
2.預設顯示 美金 英鎊 日圓 RMB
3.可供選顯示/隱藏 其他外幣資料


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("&nbsp;","");
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("&nbsp;","");
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; }
}
view raw HomeController hosted with ❤ by GitHub
@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>
view raw Index hosted with ❤ by GitHub

2016年6月2日 星期四

[SQL] 在Insert時 傳回新增的ID SCOPE_IDENTITY()

  1. /* SCOPE_IDENTITY() 會返回最後一個識別值*/
  2. INSERT INTO TableName (Column1,Value1,CreateDate)
  3. VALUES ('New',1,GETDATE())
  4. SELECT ID FROM TableName WHERE ID = SCOPE_IDENTITY();


用ExecuteScalar()進行搜尋

會返回 int

其他類似的參數 還有 @@IDENTITY、  IDENY_CURRENT


[asp.net]一些日期應用

  1. //取得 上個月月底的天數
  2. string lastMonth = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.AddMonths(-1).Month).ToString()
  3.  
  4. //取得現在時間的日期
  5. int nowDate = DateTime.Now.Day
  6.  

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

  1. function isMobile() {
  2. // return true;
  3. if (isMobiles.any()) {
  4. return true;
  5. } else {
  6. return false;
  7. }
  8. }
  9.  
  10. var isMobiles = {
  11. Android: function () {
  12. return navigator.userAgent.match(/Android/i);
  13. },
  14. BlackBerry: function () {
  15. return navigator.userAgent.match(/BlackBerry/i);
  16. },
  17. iOS: function () {
  18. return navigator.userAgent.match(/iPhone|iPad|iPod/i);
  19. },
  20. Opera: function () {
  21. return navigator.userAgent.match(/Opera Mini/i);
  22. },
  23. Windows: function () {
  24. return navigator.userAgent.match(/IEMobile/i) || navigator.userAgent.match(/WPDesktop/i);
  25. },
  26. any: function () {
  27. return (isMobiles.Android() || isMobiles.BlackBerry() || isMobiles.iOS() || isMobiles.Opera()
  28. || isMobiles.Windows());
  29. },
  30. FB: function () {
  31. return navigator.userAgent.match(/FB/i);
  32. },
  33. FBIOS: function () {
  34. return navigator.userAgent.match(/FBIOS/i);
  35. }
  36. };
  37.  
  38. function PostFB() {
  39. try {
  40. if (isMobile()) {
  41. shareurl = "https://www.facebook.com/dialog/feed?app_id=' + MyappID
  42. + '&display=touch&caption=Mycaption&link=http%3A%2F%2Fwww.google.com.tw&picture='
  43. + MyPictireLink + '&redirect_uri=' + Myredirect +'&description=Mydescription";
  44. window.open(shareurl);
  45. location.href = 'http://www.google.com';
  46. }
  47. else
  48. {
  49. FB.ui({
  50. method: 'feed',
  51. link: 'http://www.google.com',
  52. caption: '#',
  53. redirect_uri: 'http://www.google.com',
  54. picture: MyPictureLink,
  55. name: 'name',
  56. message: 'message',
  57. description: 'description',
  58. }, function (response) {
  59. if(response == undefined){
  60. //...do something
  61. }
  62. else{
  63. //...do something
  64. }
  65. });
  66. }

[MVC] 簡易分頁 PagedList

1. 先安裝 NuGet套件 - PagedList.Mvc



























2. Controller

  1. using PagedList;
  2. using PageList.Models;

  1. public ActionResult Index(int page =1)
  2. {
  3. //page用來記憶目前是哪一頁
  4. int currentPage = page < 1 ? 1 : page;
  5.  
  6. //資料必須先經過排序
  7. var product = db.Product.Where(x => x.Status == 1).OrderBy(x => x.ID);
  8.  
  9. //分頁資料使用 ToPagedList()
  10. //參數分別是傳入所要分頁的頁碼以及分頁資料量
  11. //此範例就是每一頁會有10筆資料
  12. var PageResult = product.ToPagedList(currentPage, 10);
  13.  
  14. return View(PageResult);
  15. }

3. View
















需要using PagedList.Mvc PagedList

取得分頁:

  1. @Html.PagedListPager((IPagedList)Model, page => Url.Action("Index", new { page = page}))


































  1. //設定PagedListRenderOptions 可更改樣式
  2. @Html.PagedListPager((IPagedList)Model, page => Url.Action("Index", new { page = page})
  3. ,PagedListRenderOptions.MinimalWithPageCountText)



  1. //也可以自由設定顯示物件
  2. @Html.PagedListPager((IPagedList)Model, page => Url.Action("Index", new { page = page}),
  3. new PagedListRenderOptions {
  4. DisplayLinkToIndividualPages=false,
  5. DisplayLinkToFirstPage =PagedListDisplayMode.IfNeeded,
  6. DisplayLinkToLastPage= PagedListDisplayMode.IfNeeded,
  7. DisplayLinkToNextPage = PagedListDisplayMode.IfNeeded,
  8. DisplayLinkToPreviousPage = PagedListDisplayMode.IfNeeded,
  9. DisplayPageCountAndCurrentLocation = true,
  10. PageCountAndCurrentLocationFormat ="第{0}頁 / 共{1}頁"
  11. })









https://github.com/TroyGoode/PagedList

2016年5月5日 星期四

[JS]上傳檔案大小限制

因為沒限制檔案上傳大小
所以發生了一些美麗的誤會~~~ T_T
發了此篇,以謹記在心
  1. var size = document.getElementById("file").files.item(0).size;
  2.  
  3. if (size > 10240000) {
  4. alert("上傳檔案請小於 10M");
  5. return false;
  6. }

2016年5月3日 星期二

[C#][EXIFextractor] Mobile Web 上傳圖片,照片翻轉90度 rotateImage


遇到這種問題 有點傻眼

不知道怎麼解決,測了也沒發現什麼規律性的原因(偏偏我就是拿偏偏我就是用iphone safari)

頓時有了希望全世界都生活在智障型手機的時代是多麼美好,多麼幸福,多麼......方便 ORZ

不過感嘆歸感嘆,希望歸希望,身為21世紀現代人類,還是要追求一下科技進步、社會發展



不用你們提醒我,我知道我現在很難得的正在囉嗦.............

[問題原因] 貌似是瀏覽器吃不到照片的一些tag

這裡有針對IOS詳細介紹照片方向的問題

解決之前 還要加入參考

點我連結下載頁面  進去之後點 Donload Source files

code在這

方便大家 也為了防止頁面被404狙擊 我還是備份一下



  1. HttpPostedFile file = HttpContext.Current.Request.Files["file"];
  2. //Create bitmap image from posted file
  3. System.Drawing.Bitmap bmpImg = new System.Drawing.Bitmap(file.InputStream);
  4. //rotate if needed
  5. bmpImg = rotateImage(bmpImg);
  6. //save image
  7. targetFilePath = "somewhere...";
  8. bmpImg.Save(targetFilePath, ImageFormat.Jpeg);
  1. public Bitmap rotateImage(System.Drawing.Bitmap img)
  2. {
  3. try
  4. {
  5. RotateFlipType rft = RotateFlipType.RotateNoneFlipNone;
  6. System.Drawing.Imaging.PropertyItem[] properties = img.PropertyItems;
  7. foreach (System.Drawing.Imaging.PropertyItem p in properties)
  8. {
  9. if (p.Id == 274 || p.Id == 5029)
  10. {
  11. short orientation = BitConverter.ToInt16(p.Value, 0);
  12. switch (orientation)
  13. {
  14. case 1:
  15. rft = RotateFlipType.RotateNoneFlipNone;
  16. break;
  17. case 3:
  18. rft = RotateFlipType.Rotate180FlipNone;
  19. break;
  20. case 6:
  21. rft = RotateFlipType.Rotate90FlipNone;
  22. break;
  23. case 8:
  24. rft = RotateFlipType.Rotate270FlipNone;
  25. break;
  26. }
  27. }
  28. }
  29. if (rft != RotateFlipType.RotateNoneFlipNone)
  30. {
  31. img.RotateFlip(rft);
  32. }
  33. }
  34. catch
  35. {
  36.  
  37. }
  38. return img;
  39. }
  40.  

2016年4月26日 星期二

[Jquery]scrollTop 滑鼠滾到指定位置,顯現DIV(浮水印 Top)

  1. $(function(){
  2. $(window).scroll(function () {
  3. if ($(this).scrollTop() > 800) {
  4. $('.left_BOX').fadeIn("fast");
  5. } else {
  6. $('.left_BOX').stop().fadeOut("fast");
  7. }
  8. });
  9. });


<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[]

字串陣列 轉換成 數字陣列的寫法
  1. string[] tempRGB = str.Replace("rgb(", "").Replace(")", "").Split(',');
  2.  
  3. 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
  1. function ImageArea(){
  2. $('img#imgCut').imgAreaSelect({
  3. handles: true, //是否出現小方塊 易於拖拉
  4. aspectRatio: "1:1", //比例
  5. x1: 0, y1: 0, x2: 100, y2: 100, //預設選取區塊
  6. onSelectChange: preview //及時預覽
  7. //onSelectEnd: someFunction
  8. });
  9. };

2016年3月23日 星期三

[JQuery] LazyCode 圖片載入 實現圖片看到哪Load到哪

  1. $().ready(function(){
  2. $("#lazy").find("img").lazyload({
  3. placeholder: "/img/backgroupImg.png", //背景圖
  4. effect: "fadeIn", //特效
  5. threshold: 200, //页面高度200時 開載載圖片
  6. failurelimit: 40 //載到第N個不可見區域的圖片
  7. });
  8. });
  1. //img 的src換成 data-original
  2. <div id="lazy">
  3. <img data-original="/img/ShowImg.png" />
  4. </div>

2016年3月16日 星期三

[Visual Studio 2015] 壓力測試



步驟教學

介紹壓力測試

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

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




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

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/

2016年3月10日 星期四

[javascript]windown.open 新視窗 置中

  1. $(function () {
  2. $("#Query").click(function () {
  3. //視窗的垂直位置 600是height
  4. var Top = (window.screen.availHeight - 30 - 600) / 2;
  5.  
  6. //視窗的水平位置 450 是 width
  7. var Left = (window.screen.availWidth - 10 - 450) / 2;
  8. window.open('@Url.Action("QueryMainPageID")', "搜尋官網ID",
  9. config = "innerheight=600,innerwidth=800,top=" + Top + ",left=" + Left);
  10. });

[Lambda] 多次排序的方法~ ThenBy


如果想要OrderBy 多個欄位時,可以用到ThenBy

在OrderBy裡面 寫入多個欄位是不行噠

  1. 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; 就行了


  1. var No = "";
  2. if ($(".chk").is(":checked")) {
  3. $("#Product input:checked").each(function () {
  4. if ($(this).attr("class") == "CheckALL")
  5. {
  6. return true;
  7. }
  8. No += $(this).attr("id").split("_")[1] + ",";
  9. });

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

  1. [HttpPost]
  2. public ActionResult AddNewProduct(string ID)
  3. {
  4. bool iResult = true;
  5. string msg="";
  6. bool update = true;
  7. if (update)
  8. {
  9. //把要呼叫的Function ActionResult 轉型成 JsonResult
  10. JsonResult r = (JsonResult)ProductUpdate(ID,true);
  11.  
  12. //因為拿到的r是object 所以再轉一次
  13. dynamic resultData = r.Data;
  14. //要用的時候,也要給他型別才行
  15. iResult = (bool)resultData.success;
  16. if(iResult)
  17. {
  18. msg = (String)resultData.FinishMsg;
  19. msg = msg.Replace("更新", "匯入");
  20. }else
  21. {
  22. msg = (String)resultData.ErrorMsg;
  23. msg = msg.Replace("更新", "匯入") + "請重新新增商品";
  24. }
  25. }
  26. else
  27. {
  28. //新增資料
  29. }
  30. return new JsonResult()
  31. {
  32. Data = new { success = iResult , Msg = msg }
  33. };
  34.  
  35. }

附上 stackoverflow
還是GOOGLE的高亮程式碼漂亮阿!
其實每次要把CODE放上來我都會腦抽忘了怎麼弄ORZ

2016年2月4日 星期四

[Android] TextView 文字置中



android:gravity="center_horizontal"

[Lambda]Contains 一次搜尋多筆資料

Lambda 語句中,進行類似 SQL in 的搜尋方法


  1. string[] ArrayNo = {"A111", "B222" , "C333" };
  2.  
  3. var tmp = db.Product.Where(x => x.Status == 1 && ArrayNo.Contains(x.No)).ToList();
  4.  

2016年1月20日 星期三

[AngularJS] 禮品清單

<!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>
view raw html hosted with ❤ by GitHub

2016年1月19日 星期二

2016年1月10日 星期日

[C#]DataTable select 條件搜尋和排序

塞選出 Name = Ash , 用ID和Age 做排序

  1. DataRow[] tmp = MyDataTable.Select("Name='Ash' ", "ID,Age");

2016年1月8日 星期五

[Android] WallpaperManager 設定桌布

簡單記錄一下 我有實作的部分


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
  1. // Tab名稱的全選和取消
  2. $("#AllTab").change(function () {
  3. if ($(this).is(":checked")) {
  4. $("[id*=chkTab] input").prop("checked", true);
  5. } else {
  6. $("[id*=chkTab] input").removeAttr("checked");
  7. }
  8. });
  9. $("[id*=chkTab] input").on("change", function () {
  10.  
  11. //全部都選到了,"全部"這個選項打勾,反之,則取消
  12. if ($("[id*=chkTab] input").length == $("[id*=chkTab] input:checked").length) {
  13. $("#AllTab").prop("checked", true);
  14. }
  15. else {
  16. $("#AllTab").removeAttr("checked");
  17. }
  18. });
View 順便講一下好了,checkList 這個是用來記錄CheckBox選取的狀態 MVC 才可以這樣用......
  1. //這段程式碼可以不用理他,是POSTBACK 回來時
  2. //想讓畫面保留勾選的項目
  3. @{
  4. string[] checkList = new string[7];//最後一個存放 全部 的狀態
  5. if (splitFilter[1] != null)
  6. {
  7. string[] splitck = splitFilter[1].TrimEnd(',').Split(',');
  8. if (splitck[0] != "-1")
  9. {
  10. foreach (string i in splitck)
  11. {
  12. checkList[int.Parse(i) - 1] = "checked";
  13. }
  14. }
  15. }
  16. }

Checkbox是長這樣的

<input type="checkbox" value="1" @checkList[1]><label>AA</label>




 Controller

接到勾選的Tab後,去DB搜尋
之前寫的不太簡潔,順帶記錄一下新寫法

  1. if (Tag != "-1")
  2. {
  3. List TagCondition = new List();
  4. foreach (var t in Tag.Substring(0, Tag.Length - 1).Split(','))
  5. {
  6. TagCondition.Add(Convert.ToInt32(t));
  7. }
  8. product = product.Where(x =>TagCondition.Contains(x.TabName));
  9. }