listview sorting

星期三, 三月 10, 2010 | 標籤: | 0 意見 |

今天客戶有個需求,他希望可以做出像gridview那樣可以每個column都可以sorting,可是客戶的table又很ㄋㄧㄠ,所以我決定要用ListView這個control來做出效果,這裡用簡單的方式做出來,在這紀錄一下..看code吧..

.aspx

<asp:ListView ID="ListView1" runat="server" ItemPlaceholderID="ph">
<LayoutTemplate>
<table>
<thead>
<tr>
<th>
<asp:LinkButton ID="lbtnID" runat="server"
Text="客戶編號" CommandName="客戶編號"></asp:LinkButton>
</th>
<th>
<asp:LinkButton ID="lbtnName" runat="server"
Text="公司名稱" CommandName="公司名稱"></asp:LinkButton>
</th>
<th>
<asp:LinkButton ID="lbtnContact" runat="server"
Text="連絡人" CommandName="連絡人"></asp:LinkButton>
</th>
</tr>
</thead>
<tbody>
<asp:PlaceHolder ID="ph" runat="server"></asp:PlaceHolder>
</tbody>
</table>
</LayoutTemplate>
<ItemTemplate>
<tr>
<td>
<asp:Literal ID="litT1" runat="server" Text='<%# Eval("客戶編號") %>' />
</td>
<td>
<asp:Literal ID="litT2" runat="server" Text='<%# Eval("公司名稱") %>' />
</td>
<td>
<asp:Literal ID="litT3" runat="server" Text='<%# Eval("連絡人") %>' />
</td>
</tr>
</ItemTemplate>
</asp:ListView>

.cs

public partial class _Default : System.Web.UI.Page
{
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
ListView1.LayoutCreated += new EventHandler(ListView1_LayoutCreated);
}
/// <summary>
/// 連線字串
/// </summary>
string ConnectionString
{
get
{
return ConfigurationManager
.ConnectionStrings["cNorthWindConnectionString"].ConnectionString;
}
}
/// <summary>
/// 紀錄排序的欄位名稱
/// </summary>
public string SortName
{
get
{
if (ViewState["SortName"] != null)
{
return ViewState["SortName"].ToString();
}
return "";
}
set
{
ViewState["SortName"] = value;
}
}
/// <summary>
/// 紀錄升冪還是降冪
/// </summary>
public string SortState
{
get
{
if (ViewState["SortState"] != null)
{
return ViewState["SortState"].ToString();
}
return "";
}
set
{
ViewState["SortState"] = value;
}
}
/// <summary>
/// 按鈕觸發的function
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void lbtn_Command(object sender, CommandEventArgs e)
{
using (var db = new B.Framework.DataBase.ADO.ADOHelper(ConnectionString))
{
string sortString;
string CommandName = e.CommandName.ToString();
string CommandArgument = e.CommandArgument.ToString();
if (CommandName != SortName)
{
SortName = CommandName;
SortState = "";
sortString = string.Concat("order by ", CommandName);
}
else
{
if (CommandArgument == SortState)
{
SortState = "desc";
sortString = string.Format("order by {0} desc", CommandName);
}
else
{
SortState = "";
sortString = string.Concat("order by ", CommandName);
}
}

ListView1.DataSource =
db.ExecuteTable(string.Concat("select * from 客戶 ", sortString));
ListView1.DataBind();
}

}
void ListView1_LayoutCreated(object sender, EventArgs e)
{
LinkButton lbtnID = ListView1.FindControl("lbtnID") as LinkButton;
LinkButton lbtnName = ListView1.FindControl("lbtnName") as LinkButton;
LinkButton lbtnContact = ListView1.FindControl("lbtnContact") as LinkButton;
lbtnName.Command += new CommandEventHandler(lbtn_Command);
lbtnID.Command += new CommandEventHandler(lbtn_Command);
lbtnContact.Command += new CommandEventHandler(lbtn_Command);
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
InitForm();
}
}
/// <summary>
/// 初始化
/// </summary>
private void InitForm()
{
using (var db = new B.Framework.DataBase.ADO.ADOHelper(ConnectionString))
{
ListView1.DataSource =
db.ExecuteTable(string.Concat("select * from 客戶 "));
ListView1.DataBind();
}
}
}

效果圖:

image

參考:

加入書籤:

清除全部的 cache

星期二, 三月 02, 2010 | 標籤: | 0 意見 |

今天在處理客戶的需求, 客戶有很多功能都有用到 cache, 可是客戶說在測試網站功能時,又不希望有 cache, 因為有 cache 就要等 cahce 過期後才能讀到資料厙的新資料, 所以需要寫個程式去清理 cache 內的所有資料, 看了一下 cache 的 method 並沒有提供清除全部 cache 的 function, 所以就自己土砲寫一下吧..

List<string> removeList = new List<string>();
foreach (DictionaryEntry cacheItem in HttpRuntime.Cache)
{
removeList.Add(cacheItem.Key.ToString());
}
foreach (string key in removeList)
{
HttpRuntime.Cache.Remove(key);
}

這樣就可以完成需求啦..^_____^..

參考:
http://msdn.microsoft.com/zh-tw/library/system.collections.dictionaryentry.aspx
http://msdn.microsoft.com/zh-tw/library/system.web.caching.cache%28VS.80%29.aspx

加入書籤:

Sikuli 用圖片寫程式

星期五, 二月 19, 2010 | 標籤: | 1 意見 |

哈..好久沒有寫網誌了..我真是一整個懶..不行不行要振作..^^..

今天要來介紹一個很好玩的東西 Sikuli 這東西真的不錯用, 用圖形來寫程式真是一絕, 寫起來也很輕鬆自在, 直接看我寫的小範例吧..

image

上面這段小程式執行的動作是開啟 ie 後, 用 search engine 找 Bibby 這個 key word, 跑出結果再點進我的 blog, 一整個直覺..讚..這個ide界面的程式環境也很簡單, 如果不看官方介紹, 自己trytry就會用的, 不過建議還是看一下官方的介紹啦..

在撰寫程式時, 有時後會找不到你要執行程式的目標點, 這時你就可以點選目標圖片, 會跑出下面這個視窗, 在這視窗調整找尋找目標點的相似度, 調整使目標點唯一, 就不會有找不到目標點的問題了

image

當我們寫好程式後, 我們希望用command-line的方式來執行, 因為這樣我們就可以用"工作排程"這東東來定時跑一下, 我們先把我們寫的程式匯出成.skl檔

image

之後我們就可以在command-line裡面執行了

image

第一次執行會遇到錯誤

image

這時你只要設定你的環境就可以了..

image

image

在這新增兩個使用者變數(下面是我電腦的環境,請自行斟酌修改)

classpath
.;C:\Program Files (x86)\Java\jre6\bin;

path
.;C:\Program Files (x86)\Java\jre6\bin;

這樣就可以啦..^^..來看一下官方的影片吧..

參考:
http://groups.csail.mit.edu/uid/sikuli/download.shtml
http://blog.vgod.tw/

加入書籤:

中文星期排序

星期五, 一月 15, 2010 | 標籤: | 1 意見 |

最近有個朋友他問我一個需求,他說他想抓出資料,然後用星期來排序,我直覺的反應不難阿只要下 order by 就好啦,可是他說不行,下了 order by 還是不會照"星期一到星期日"排序,我覺的奇怪,直接看他的資料庫,原來欄位是用中文的方式存進去(我是習慣都用數字),哈..事情不是愚人想的這麼簡單,不過事情總是有解決的方法,我們還是可以在DB裡面處理在抓出來低,看code吧..

select * from xxxTable
order by charindex(rtrim(ltrim(weekday)),'星期一,星期二,星期三,星期四,星期五,星期六,星期日')

這樣抓就對的啦..收工..

參考:
http://msdn.microsoft.com/zh-tw/library/ms186323.aspx

加入書籤:

取得某年某月的天數

星期五, 一月 08, 2010 | 標籤: | 1 意見 |

今天在網路上看文章的時候,看到"亂馬客"一篇"取得某月的天數 SQL Function",腦袋想了一想..好像還有另一種方法..所以就把這想法寫下來了..


DECLARE  @yyyy VARCHAR(4)
DECLARE @mm VARCHAR(2)

set @yyyy='2008'
set @mm='02'

select
datediff(dd,0,dateadd(mm, datediff(mm,0,@yyyy+'/'+@mm+'/01')+1,0))
- datediff(dd,0,dateadd(mm, datediff(mm,0,@yyyy+'/'+@mm+'/01'),0)) as result


這樣就可以得到結果了..有問題再討論吧..

ps:線上版的syntax highlighting好醜阿.........XDXDXD......

加入書籤:

取出資料庫特定範圍的資料

星期六, 十二月 26, 2009 | 標籤: | 0 意見 |

最近做專案遇到一個不錯的問題,就是如何可以在database裡取出一段特定範圍的record,這樣的敘述看這樣看起來沒啥感覺,我們舉個例子好了,像無名的相簿這樣..

image

程式是由pk來抓取出前兩筆record跟後兩筆record,加上目前的一共抓出5筆,這樣一解釋大家就懂啦..現在我們現在拿NorthWind的Orders來當範例吧(如果有無名的database我就拿無名的給大家分享..哈)..直接看code吧..

with temp as(
select row_number() over (order by OrderDate) as rn, *
from Orders
)
,RealOrder as(
select rn
from temp
where OrderID = '10261'
)
select *
from temp
where rn between ((select * from RealOrder)-5) and ((select * from RealOrder)+5)

這樣就可以取出指定的Orders前5筆跟後5筆record啦..簡單吧..

ps:這是在mssql2005以上才支援的語法啦,自己看著辦吧..

加入書籤:

動態聯繫 anonymous types 的 class

星期四, 十二月 03, 2009 | 標籤: | 0 意見 |

anonymous types 在 .net framework 3.5 才有的功能..我也常常用它來處理臨時資料的問題..一直覺得 anonymous types 是個好東西..今天寫程式的時候遇到了一個問題..就是要把 anonymous types 動態去塞入repeater 控制項內..忽然不知怎麼去處理..想了一下原來是腦袋打了結..休息一下..看看外面灰灰的天空..通啦..^^||..紀錄一下..

.aspx

<form id="form1" runat="server">
<div>
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<asp:Literal ID="litName" runat="server" />,
<asp:Literal ID="litUrl" runat="server" /><br />
</ItemTemplate>
</asp:Repeater>
</div>
</form>

.cs

protected void Page_Load(object sender, EventArgs e)
{
var data = new[] {
new{name="Bibby",url="http://bibby.be"},
new{name="Yahoo",url="http://tw.yahoo.com"},
new{name="Google",url="http://google.com"}
};

Repeater1.ItemDataBound +=
new RepeaterItemEventHandler(Repeater1_ItemDataBound);
Repeater1.DataSource = data;
Repeater1.DataBind();
}

void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
object o = e.Item.DataItem;
Literal litName = e.Item.FindControl("litName") as Literal;
Literal litUrl = e.Item.FindControl("litUrl") as Literal;

litName.Text = DataBinder.Eval(o, "name").ToString();
litUrl.Text = DataBinder.Eval(o, "url").ToString();
}

不過話說..DataBinder.Eval 方法在 msdn 裡面有說它校能不是很好啦..省著點用吧..

參考:

加入書籤: