星期三, 4月 30, 2008

PageMethods(WebService) 處理 class 型別

在書上看到這東東的應用..發現還蠻不錯的..就測試一下..看原始碼說故事摟..^^..

.aspx網頁上就丟兩個button..

<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="True">
</asp:ScriptManager>
<div>
<input type="button" value="test" onclick="getMsgC();" />
<input type="button" value="post" onclick="setMsgC();" />
</div>
</form>
</body>

.aspx再把下面的js丟上去..就是去寫PageMethod

<script type="text/javascript">
//抓取server端的class-------------------------------
function getMsgC()
{
PageMethods.getClass(5,4,3,getFinall);
}
function getFinall(result)
{
alert(result.a + ',' + result.b + ',' + result.c);
}

//設定server端的class,然後在取回class-------------------------------
function setMsgC()
{
var method = new setMsg();
method.a = 999;
method.b = 999;
method.c = 999;

PageMethods.setMehod(method,setFinall);
}
function setFinall(result)
{
alert(result.a + ',' + result.b + ',' + result.c);
}
</script>

.cs 這裡就放該放的原始碼..

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Web.Script.Services;
using System.Web.Services;

public partial class test_json : System.Web.UI.Page
{
//抓取server端的class
[WebMethod]
public static getMsg getClass(int msg1, int msg2, int msg3)
{
return new getMsg() { a = msg1, b = msg2, c = msg3 };
}

//設定server端的class
[WebMethod]
[GenerateScriptType(typeof(setMsg))]
[ScriptMethod(UseHttpGet = true)]
public static setMsg setMehod(setMsg obj)
{
return obj;
}

protected void Page_Load(object sender, EventArgs e)
{

}
}
public class getMsg
{
public getMsg() { }

public int a { get; set; }
public int b { get; set; }
public int c { get; set; }
}

public class setMsg
{
public setMsg() { }

public int a { get; set; }
public int b { get; set; }
public int c { get; set; }
}

上面這原始碼的意思是說..用PageMethod來傳遞設定class..微軟在應用PageMethod(WebService)
這些方法會是用json格式來傳遞資料,我們接到server端傳回來的東西後..就會經過Sys.Serialization.JavaScriptSerializer
來處理它..之後就會丟到我們設定的回呼函式..這樣就可以收到結果啦..Rolling on the floor..真是個蠻方便的東東..

ADO.NET Data Services印象中也有提供一組專屬的js來做同樣的事情..沒用力去研究..
有錯要提醒一下ㄟ..

http://www.asp.net/AJAX/Documentation/Live/ClientReference/default.aspx

如何讓用戶端 cache 失效

之前在做專案時..遇到這個問題..google一下..可以找到..在html裡加入

<HEAD>
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
</HEAD>

這方法是有一些風險的..因為有些瀏覽器不支援上面這東東..所以可能會沒有效果..^^||..
有一種更好的方式..就是改http得標頭..直接看原始碼..

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
Response.Cache.SetExpires(DateTime.MinValue);

看一下結果..

gde

完成..^^..

參考:

星期二, 4月 29, 2008

usercontrol互相傳值

話說兩個不相信任的政黨..要互相移交政權..要好好的傳地下去..是有點給它難..
話說兩個不相關的usercontrol要互相丟值接值..感覺起來也是不怎麼好用..
(這開場白好像有點鳥..HotHotHotHotHotHotHotHotHotHotHotHotHotHotHotHot..)

google一下..可以發現有人提供一些方法..像interface這樣很正統的解決方法..不過..
真的有點給它努力認真研究..才可以給它懂(我就是這樣懂的..On the phone..)
如果看不懂或是想偷懶..那有啥方法呢?..有低..session..application都可以解決..
那我寫這篇文章幹麼..Nerd..當然還有其他方法啦..不過..也算小撇步..
跟session..application的想法是一樣的..

直接看圖說故事ㄅ..

textbox.ascx..這一個usercontrol放一個textbox和一個button

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="textbox.ascx.cs" Inherits="usercontrol_textbox" %>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />

textbox.ascx.cs

protected void Page_Load(object sender, EventArgs e)
{

}
protected void Button1_Click(object sender, EventArgs e)
{
HttpContext.Current.Items["textbox"] = TextBox1.Text;
}

label.ascx..這一個usercontrol放一個label

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="label.ascx.cs" Inherits="usercontrol_label" %>
<asp:Label ID="Label1" runat="server" Text=""></asp:Label>

label.ascx.cs

protected void Page_Load(object sender, EventArgs e)
{

}
void Page_PreRender(object sender, EventArgs e)
{
Label1.Text = (string)HttpContext.Current.Items["textbox"];
}

CurrentItems.aspx..這裡把兩個usercontrol放進來..

<body>
<form id="form1" runat="server">
<div>
<uc1:textbox ID="textbox1" runat="server" />
<br />
<uc2:label ID="label1" runat="server" />
</div>
</form>
</body>

執行就可以抓到值啦..Clown..感覺一整個懶..XD..
這裡就是用HttpContext.Current.Items["abc"]這東西..

msdn說..

取得索引鍵/數值集合,其可用以在 HTTP 要求期間,於 IHttpModule 介面和 IHttpHandler 介面之間組織並共用資料。


所以非常適合短暫的存取資料..usercotrol傳遞資料..Happy

參考:
http://msdn2.microsoft.com/zh-tw/library/system.web.httpcontext.items.aspx

星期五, 4月 25, 2008

(簡單範例)用SqlBulkCopy大量寫入資料庫結合交易

這幾天在案子在寫這東西..發現..一點都不難..一點點程式就寫完了..Hot
大家看圖說故事..這樣比較快..^^..

名字dbo.test資料庫

ghj

.aspx頁面..就放兩個button..有各自的事件

<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" Text="大量寫入" onclick="Button1_Click" />
&nbsp;<asp:Button ID="Button2" runat="server" Text="刪除" onclick="Button2_Click" />
</div>
</form>
</body>

.cs簡單的說就是先產生一個datatable..把你要寫入資料庫的東西..先寫在datatable
然後在一次大量寫入資料庫..原理很簡單..

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
using System.Transactions;

public partial class test_sqlBulkCopy : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}

protected void Button1_Click(object sender, EventArgs e)
{
//產生source table
DataTable sourceDt = new DataTable();
sourceDt.Columns.Add("id", typeof(int));
sourceDt.Columns.Add("a", typeof(string));
sourceDt.Columns.Add("b", typeof(string));
sourceDt.Columns.Add("c", typeof(string));

//看你要產生幾筆row先寫在datatable
for (int i = 0; i < 10; i++)
{
DataRow dr = sourceDt.NewRow();
dr["a"] = "a" + i.ToString();
dr["b"] = "b" + i.ToString();
dr["c"] = "c" + i.ToString();
sourceDt.Rows.Add(dr);
}

//加入2.0以後的交易,記得匯入System.Transactions.dll
using (TransactionScope myScope = new TransactionScope())
{
//大量寫入
using (SqlConnection myConn = new SqlConnection(ConfigurationManager.
ConnectionStrings["NORTHWNDConnectionString"].ConnectionString))
{
myConn.Open();

using (SqlBulkCopy mySbc = new SqlBulkCopy(myConn))
{
//設定
mySbc.BatchSize = 1000;
mySbc.BulkCopyTimeout = 60;

//處理完後丟出一個事件,或是說處理幾筆後就丟出事件
mySbc.NotifyAfter = sourceDt.Rows.Count;
mySbc.SqlRowsCopied += new SqlRowsCopiedEventHandler(mySbc_SqlRowsCopied);

//更新哪個資料庫
mySbc.DestinationTableName = "dbo.test";

//column對應
mySbc.ColumnMappings.Add("id", "id");
mySbc.ColumnMappings.Add("a", "a");
mySbc.ColumnMappings.Add("b", "b");
mySbc.ColumnMappings.Add("c", "c");

//寫入
mySbc.WriteToServer(sourceDt);
//throw new Exception("error");

//完成交易
myScope.Complete();
}
}
}
}

void mySbc_SqlRowsCopied(object sender, SqlRowsCopiedEventArgs e)
{
ClientScript.RegisterStartupScript(GetType(), "test", "alert('完成');", true);
}

protected void Button2_Click(object sender, EventArgs e)
{
//刪除測試資料
linqToSqlDataContext db = new linqToSqlDataContext();
db.ExecuteCommand("DELETE FROM test");
ClientScript.RegisterStartupScript(GetType(), "test", "alert('完成');", true);
}
}

這樣就完成了..順便說一下..2.0的交易真的超簡單的..包住..就給可以跑..哈哈..
大家參考一下..有問題說ㄅ..

jquery 處理 attributes 的 attr(Name) method

今天在jquery處理html的DOM時..發現一件蠻機車的事..就是ie跟firefox抓出來的東西是不一樣的..Baring teeth..
原本用Javascript framework就是不想遇到不同瀏覽器有不同的解析..結果還是被我遇到了..Confused..
害我一開始很相信jquery..沒有把重點放在client端..在抓server端..花一堆時間..悶阿..

兇手就是這個"attr(name)"..Pig..不過也不能怪它..因為我抓的是onclick這東西..沒啥人這樣抓的..(我就偷懶才這樣抓..)

我把處理方法寫下來給大家參考ㄅ..以後遇到..好解決..

var aa = new $("#aa").attr('onclick').toString();

//是ie的話..處理它..XD
if($.browser.msie)
{
//把斷行去掉
var breakChar = /\n/g;
//把不該出現的東西拿掉
aa = aa.replace(breakChar,'').replace('function anonymous(){','').replace('}','');
}
alert(aa);

最後..我想說的是..Regular Expression要學好阿..以後受益無窮..Puppy dog eyes

regular expression學習資源
http://blog.miniasp.com/post/2008/03/Regular-Expression-Regex-Learning-Resources.aspx

星期三, 4月 23, 2008

CascadingDropDown with PageMethods

今天在工作上有需要一個連動式的dropdownlist..想到之前看到ajaxtoollit裡有CascadingDropDown這東東..
就拿來研究給它用一下..看看是個多神奇的東西..

網路上教學都是用它跟webservice的結合..我想說..我也只有這一頁會用到..所以我就用PageMethods去完成..

先看.cs

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

using System.Collections.Generic;
using System.Collections.Specialized;
using System.Web.Services;
using AjaxControlToolkit;

public partial class test_test11 : System.Web.UI.Page
{
[WebMethod]
public static CascadingDropDownNameValue[] GetColorsForModel(string knownCategoryValues, string category)
{
//這行是它寫好的東東在AjaxControlToolkit.dll裡面
StringDictionary kv = CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues);

List<CascadingDropDownNameValue> sArray = new List<CascadingDropDownNameValue>();

//category是來判斷要跑哪個function
if (category == "c1")
{
//從資料庫抓第一個選項的資料
//new myDataSetTableAdapters._addressZipC1TableAdapter()._addressZipC1()這是我另外寫的class來抓資料庫的
DataTable myTb = new myDataSetTableAdapters._addressZipC1TableAdapter()
._addressZipC1();
return toArray(sArray, myTb);
}
if (category == "c2")
{
//從資料庫抓第二個選項的資料,kv["c1"]是進來的參數,來提供database來篩選資料
DataTable myTb = new myDataSetTableAdapters._addressZipC2WhereC1TableAdapter()
._addressZipC2WhereC1(kv["c1"]);
return toArray(sArray, myTb);
}
if (category == "c3")
{
//從資料庫抓第三個選項的資料..等等等..跟上面一樣
DataTable myTb = new myDataSetTableAdapters._addressZipC3WhereC2C3TableAdapter()
._addressZipC3WhereC2C3(kv["c1"], kv["c2"]);
return toArray(sArray, myTb);
}
if (category == "c4")
{
//從資料庫抓第四個選項的資料..等等等..跟上面一樣
DataTable myTb = new myDataSetTableAdapters._addressZipC4WhereC2C3C4TableAdapter()
._addressZipC4WhereC2C3C4(kv["c1"], kv["c2"], kv["c3"]);
return toArray(sArray, myTb);
}
return null;
}

//這就是ajaxtoolkit自己寫的class
private static CascadingDropDownNameValue[] toArray(List<CascadingDropDownNameValue> sArray, DataTable myTb)
{
foreach (DataRow ro in myTb.Rows)
{
sArray.Add(new CascadingDropDownNameValue(ro[0].ToString(), ro[0].ToString()));
}
return sArray.ToArray();
}

protected void Page_Load(object sender, EventArgs e)
{

}
}

再看.aspx

<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="True">
</asp:ScriptManager>
<div>
<h4>
<asp:DropDownList ID="DropDownList1" runat="server" Width="140px">
</asp:DropDownList>
<ajaxToolkit:CascadingDropDown ID="CascadingDropDown1" runat="server" Category="c1"
LoadingText="讀取中.." TargetControlID="DropDownList1" ServiceMethod="GetColorsForModel"
PromptText="請選擇..">
</ajaxToolkit:CascadingDropDown>
</h4>
<h4>
<asp:DropDownList ID="DropDownList2" runat="server" Width="140px">
</asp:DropDownList>
<ajaxToolkit:CascadingDropDown ID="CascadingDropDown2" runat="server" Category="c2"
LoadingText="讀取中.." TargetControlID="DropDownList2" ServiceMethod="GetColorsForModel"
ParentControlID="DropDownList1" PromptText="請選擇..">
</ajaxToolkit:CascadingDropDown>
</h4>
<h4>
<asp:DropDownList ID="DropDownList3" runat="server" Width="140px">
</asp:DropDownList>
<ajaxToolkit:CascadingDropDown ID="CascadingDropDown3" runat="server" Category="c3"
LoadingText="讀取中.." TargetControlID="DropDownList3" ServiceMethod="GetColorsForModel"
ParentControlID="DropDownList2" PromptText="請選擇..">
</ajaxToolkit:CascadingDropDown>
</h4>
<h4>
<asp:DropDownList ID="DropDownList4" runat="server" Width="140px">
</asp:DropDownList>
<ajaxToolkit:CascadingDropDown ID="CascadingDropDown4" runat="server" Category="c4"
LoadingText="讀取中.." TargetControlID="DropDownList4" ServiceMethod="GetColorsForModel"
ParentControlID="DropDownList3" PromptText="請選擇..">
</ajaxToolkit:CascadingDropDown>
</h4>
</div>
</form>
</body>

效果頁面

頁面很簡單..就一個ScriptManager..和四個DropDownList跟CascadingDropDown..
重點就是..ScriptManager的EnablePageMethods要開..不然用半天..都會跟你說error 500..
會很傷心的..哈..^^||..

結論:
傳統的UpdatePanel去做..其實簡單輕鬆..很容易就做出來了..但是..
用這CascadingDropDown視覺效果和結合PageMethods(WebService)效率..是可以一試的..
留這篇給大家參考ㄅ..^^..

參考:
http://asp.net/AJAX/AjaxControlToolkit/Samples/CascadingDropDown/CascadingDropDown.aspx

星期二, 4月 22, 2008

世界地球日

4/22是世界地球日..

那..我能為這個地球盡點啥力..

少開點燈..
少吃點肉..
水用少一點..
尿尿不沖水..
大便不洗手..
想放屁憋住..
機車放這生鏽..腳踏車慢慢龜..

XD..我知道要怎樣做了..

把今天貢獻給地球..那就翹班在家睡一整天..

HotHotHotHotHotHot...

--wiki的世界地球日--
--宣導短片--
--台灣地球日--

星期一, 4月 21, 2008

利用 Syndication 讀取 RSS

3.5有提供新的namespace可以很輕鬆去讀取rss這東東..就是System.ServiceModel.Syndication
這namespace很簡單很白痴的就可以讀取..

我做個簡單範例+linq去做

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Xml;
using System.ServiceModel.Syndication;
using System.Collections.Generic;
using System.Text;

public partial class test_res : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
XmlReader reader = XmlReader.Create("http://www.nba.com/rss/nba_rss.xml");

Rss20FeedFormatter formatter = new Rss20FeedFormatter();
formatter.ReadFrom(reader);
reader.Close();

StringBuilder str = new StringBuilder();

//抓feed's title
str.AppendLine(formatter.Feed.Title.Text);
str.AppendLine("<br /><br />");

//只抓5項
IEnumerable<SyndicationItem> feed = formatter.Feed.Items.Take(5);

//顯示內容
foreach (SyndicationItem item in feed)
{
str.AppendLine(item.Title.Text);
str.AppendLine("<br />");
str.AppendLine(item.Links[0].Uri.ToString());
str.AppendLine("<br />");
str.AppendLine(item.Summary.Text);
str.AppendLine("<br />");
//str.AppendLine(item.PublishDate.DateTime.ToString("yyyy/MM/dd hh:mm:ss"));
str.AppendLine("<br /><br />");
}

Response.Write(str.ToString());
}
}

用這方式去抓rss就不用再用難用的(因該是說不習慣的)xpath去濾我想抓幾筆的方式..
結合Linq也可以做很多我們想做的事..例如要濾出那些內容時間等等等..
所以大家可以參考一下..Open-mouthed..

要詳細點可以看一下面這連結..
http://msdn2.microsoft.com/en-us/library/system.servicemodel.syndication.aspx
http://www.cnblogs.com/francis67/archive/2008/03/24/1120273.html
http://www.dotnetbips.com/articles/addaf09f-9b6b-45d2-aba8-da11f23aa53e.aspx

星期四, 4月 17, 2008

如何動態建立validation 去驗證 userControl

今天在論壇上看到這個問題..說難不難..說簡單也還好..就是江湖一點絕..Hot..
寫個簡單的範例..看看ㄅ..

UserControl原始碼

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs"
Inherits="usercontrol_WebUserControl" %>

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

.aspx原始碼

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="testUsercontrol.aspx.cs"
Inherits="test_testUsercontrol" %>


<%@ Register Src="../usercontrol/WebUserControl.ascx" TagName="WebUserControl" TagPrefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<uc1:WebUserControl ID="WebUserControl1" runat="server" />
</div>
</form>
</body>
</html>

.cs原始碼

public partial class test_testUsercontrol : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//先找到usercontrol's textbox
usercontrol_WebUserControl uc = Page.FindControl("WebUserControl1") as usercontrol_WebUserControl;
TextBox tb = uc.FindControl("TextBox1") as TextBox;

//新增validation
RangeValidator rv = new RangeValidator();
rv.Display = ValidatorDisplay.Dynamic;
rv.Text = "error";
rv.MaximumValue = "50";
rv.MinimumValue = "0";
rv.Type = ValidationDataType.Integer;
rv.ControlToValidate = tb.UniqueID;

//加入頁面
form1.Controls.Add(rv);
}
}

我的作法是一步一步的..先去抓usercontrol..再去抓textbox..
其實也可以WebUserControl1.FindControl("TextBox1") as TextBox直接就這樣去抓..
反正目的就是把"父親兒子的關西"抓出來就好了..^^..

解決收工..Open-mouthed..

星期二, 4月 15, 2008

巢狀式迴圈..效率..

許多大大一定有寫過..巢狀式迴圈..就是..下面這樣

for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if(oo==xx)
{
.....
}
}
}

昨天就在寫這方面的class.發現..就算有加入break效率也不怎樣..
就寫了簡單的例子去改寫一下程式..把巢狀式迴圈..變成只有一層..

巢狀式
Stopwatch watch = new Stopwatch();
int count = 0;
List<int> nu = new List<int>();
List<int> nu1 = new List<int>();

for (int i = 0; i < 10000; i++)
{
nu.Add(i);
}
for (int j = 0; j < 10000; j++)
{
nu1.Add(j);
}

watch.Start();
foreach (int a in nu)
{
foreach (int b in nu1)
{
if (a == b)
{
count++;
}
}
}
watch.Stop();

Response.Write(watch.ElapsedMilliseconds / 1000f + "<br />");
Response.Write(count);

單迴圈
Stopwatch watch = new Stopwatch();
int count = 0;
List<int> nu = new List<int>();
List<int> nu1 = new List<int>();

for (int i = 0; i < 10000; i++)
{
nu.Add(i);
}
for (int j = 0; j < 10000; j++)
{
nu1.Add(j);
}

watch.Start();
foreach (int a in nu)
{
if (nu1.Contains(a))
{
count++;
}
}
watch.Stop();

Response.Write(watch.ElapsedMilliseconds / 1000f +"<br />");
Response.Write(count);

結果..上面的測試..
巢狀式:平均1.35秒
單層式:平均0.46秒

上面兩個例子效果其實是一樣的..我把巢狀式改成單迴圈..然後用contains來代替..
查一下.net framework的contains的method..

bool IList.Contains(object value)
{
return (IndexOf(this, value) >= this.GetLowerBound(0));
}

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public static int IndexOf(Array array, object value)
{
if (array == null)
{
throw new ArgumentNullException("array");
}
int lowerBound = array.GetLowerBound(0);
return IndexOf(array, value, lowerBound, array.Length);
}

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public static int IndexOf(Array array, object value, int startIndex, int count)
{
int num2;
if (array == null)
{
throw new ArgumentNullException("array");
}
int lowerBound = array.GetLowerBound(0);
if ((startIndex < lowerBound) || (startIndex > (array.Length + lowerBound)))
{
throw new ArgumentOutOfRangeException("startIndex", Environment.GetResourceString("ArgumentOutOfRange_Index"));
}
if ((count < 0) || (count > ((array.Length - startIndex) + lowerBound)))
{
throw new ArgumentOutOfRangeException("count", Environment.GetResourceString("ArgumentOutOfRange_Count"));
}
if (array.Rank != 1)
{
throw new RankException(Environment.GetResourceString("Rank_MultiDimNotSupported"));
}
if (TrySZIndexOf(array, startIndex, count, value, out num2))
{
return num2;
}
object[] objArray = array as object[];
int num3 = startIndex + count;
if (objArray != null)
{
if (value == null)
{
for (int i = startIndex; i < num3; i++)
{
if (objArray[i] == null)
{
return i;
}
}
}
else
{
for (int j = startIndex; j < num3; j++)
{
object obj2 = objArray[j];
if ((obj2 != null) && obj2.Equals(value))
{
return j;
}
}
}
}
else
{
for (int k = startIndex; k < num3; k++)
{
object obj3 = array.GetValue(k);
if (obj3 == null)
{
if (value == null)
{
return k;
}
}
else if (obj3.Equals(value))
{
return k;
}
}
}
return (lowerBound - 1);
}

看起來也是要跑迴圈也沒有比直接if else簡單多少..可是效率好很多..Dont tell anyone..
所以個人的猜測就是.net framework一定有偷偷最佳化過啦..Hot..
還有在javascript也是一樣的情形..用巢狀式的效率也低於單層式的..

ps:小弟只是已微薄的知識去猜測的..各位大大如果不同的觀念..請給小弟多多指教..^^..

星期五, 4月 11, 2008

(簡單範例)jQuery 處理 HTML Elements

今天在處理案子上..需要大量使用javascript去跑..傳統的javascript寫出來的常常"露露長"..Tongue out
所以就把最近在大家稱讚的jquery拿出來跟ajax framework來配合使用..看可以省多少工..

來個簡單的範例..先做一個亂數表

a

然後按下"抓單數"這按鈕..

b

效果就達到啦..
來看一下html原始碼..

<form id="form1" runat="server">
<!--這裡是加入jquery-->
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Scripts>
<asp:ScriptReference Path="~/js/jquery-1.2.3.js" />
</Scripts>
</asp:ScriptManager>

<!--這裡是簡單的css-->
<style type="text/css">
.tableCss
{
width: 300px;
height: 300px;
border: 1px solid #008000;
border-collapse: collapse;
}
.tableCss td
{
border: 1px solid #008000;
text-align: center;
}
</style>

<!--這裡是簡單的table-->
<table cellpadding="0px" cellspacing="0px" class="tableCss">
<tr>
<td>15</td>
<td>02</td>
<td>07</td>
<td>04</td>
</tr>
<tr>
<td>10</td>
<td>06</td>
<td>03</td>
<td>09</td>
</tr>
<tr>
<td>12</td>
<td>05</td>
<td>11</td>
<td>08</td>
</tr>
<tr>
<td>16</td>
<td>14</td>
<td>01</td>
<td>13</td>
</tr>
</table>

<!--這裡加入button-->
<input id="Button1" type="button" value="抓單數" onclick="singleNum()"/>
<input id="Button2" type="button" value="清除" onclick="clearAll()"/>
</form>

js原始碼

<script type="text/javascript">
function singleNum()
{
//把所有的符合條件element都抓出來
var arr = $('.tableCss td').get();

//用microsoft ajax client的array擴充功能來跑foreach
Array.forEach(arr,function(item){
var elem = $(item);
if(Number.parseInvariant(elem.text()) % 2 ==1)
{
elem.css('background-color','silver');
}
});
}
function clearAll()
{
//把所有的符合條件element都抓出來,然後清除
$('.tableCss td').removeAttr('style');
}
</script>

輕鬆簡單..一下子就做完啦..跟傳統的作法省了蠻多東西的.. 尤其是Intellisense這部份..
是我最想要的..雖然還是跑不了跑迴圈的宿命..Disappointed..但是..爽度增加很多..^^..讚..
不過這樣也有缺點的..就是網頁的基本容量就很大..至少60k起跳..
如果需要簡單的功能的話..直接用傳統的javascript就好啦..不需要這麼麻煩..

星期四, 4月 10, 2008

Compression and Decompression of Files(C#)

今天遇到一個問題..就是要壓縮備份資料庫的mdb..google找了一些文章..用asp.net去試了一下..參考小喵的文章
http://blog.blueshop.com.tw/topcat/archive/2008/02/04/54267.aspx

寫出一組的class..因為小喵的是用vb寫的..我就把我的C#版丟出來..大家有需要去用ㄟ..

public class Compressor
{
/// <summary>
/// 壓縮資料夾
/// </summary>
/// <param name="originalFile">被壓縮的資料夾名稱</param>
/// <param name="compressedFile">壓縮後的名稱</param>
public void CompressDirectory(string originalFile, string compressedFile)
{
if (!Directory.Exists(originalFile))
throw new Exception(string.Format("{0}資料夾位置錯誤", originalFile));
try
{
//開始壓縮
new FastZip().CreateZip(compressedFile, originalFile, true, "");
}
catch
{
throw new Exception("處理壓縮錯誤");
}
}
/// <summary>
/// 壓縮檔案,檔名為時間戳記
/// </summary>
/// <param name="originalFile">被壓縮的檔案名稱</param>
public void CompressFile(string originalFile)
{
//加入時間戳記
string newFileName = string.Format(@"{0}{1:_yyyyMMdd_hhmmss}.zip",
Path.GetFileNameWithoutExtension(originalFile), DateTime.Now);
string target = originalFile.Replace(Path.GetFileName(originalFile), newFileName);
CompressFile(originalFile, target);
}
/// <summary>
/// 壓縮檔案
/// </summary>
/// <param name="originalFile">被壓縮的檔案</param>
/// <param name="compressedFile">壓縮後的名稱</param>
public void CompressFile(string originalFile, string compressedFile)
{
if (!File.Exists(originalFile))
throw new Exception(string.Format("{0}檔案位置錯誤", originalFile));
try
{
using (ZipOutputStream zo = new ZipOutputStream(File.Create(compressedFile)))
using (FileStream fs = File.OpenRead(originalFile))
{
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);

ZipEntry entry = new ZipEntry(Path.GetFileName(originalFile));
//Entry.ForceZip64();//檔案大於4G時使用
entry.DateTime = DateTime.Now;
entry.Size = fs.Length;

zo.SetLevel(9);
zo.PutNextEntry(entry);
zo.Write(buffer, 0, buffer.Length);
zo.Finish();
}
}
catch
{
throw new Exception("檔案壓縮錯誤");
}
}
/// <summary>
/// 解壓縮檔案
/// </summary>
/// <param name="compressedFile">被解壓縮的檔案名稱</param>
/// <param name="decompressedFile">解壓縮後的資料夾名稱</param>
public void DecompressFile(string compressedFile, string decompressedFile)
{
if (!File.Exists(compressedFile))
throw new Exception(string.Format("{0}檔案位置錯誤", compressedFile));
try
{
//開始解壓縮
new ICSharpCode.SharpZipLib.Zip.FastZip().ExtractZip(compressedFile, decompressedFile, "");
}
catch
{
throw new Exception("檔案解壓縮錯誤");
}
}
}

不過測試結果..壓縮ICSharpCode.SharpZipLib壓縮解壓縮真的有點慢..不知道試我用隨身碟..還是因為我電腦慢的關西..Disappointed..有任何問題..留言一下ㄅ..Nerd..

ps:記得還是要去這網站下載ICSharpCode.SharpZipLib.dll這東西ㄟ..才可以跑..

---20080915更新class..因為之前寫得很爛..XD..---

星期二, 4月 08, 2008

linq 相對於 tsql 的 in, like

今天在處理一個datatable想要濾出我想要的值..就把linq這把大刀拿起來..開始工作..
一般來說tsql我們都會這樣下..

Select * from table1 where id in (1,2,3,4)

發現..linq裡面好像沒有in這東西..一﹏一||..
按照慣例..當然是google一下..哈..也很順利找到一些答案..
下面這兩篇文章寫的很詳細..自己看..不加累述了
http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/10/16/linq-to-sql-like-operator.aspx
http://www.cnblogs.com/126/archive/2007/08/01/839448.html

這是我處理datatable的原始碼..

int[] gidT = new int[] { 2, 7, 8, 9, 10 };
var dtT = from enumDt in dt.AsEnumerable()
where gidT.Contains(enumDt.Field<int>("g_id"))
select enumDt;

Silverlight 2.0 Application 發佈

今天把silverlight 2.0丟到server上..發現有些問題..
google一下..找到這篇文章Silverlight 2.0 App Not Starting - Fix IIS

原來IIS7對silverlight 2.0的xap不支援..
解決方法只要在iis7的MIME Type上加上需要的extension就行了..

File name extension .xap
MIME type: application/x-silverlight-app

這樣就解決這問題了..Thumbs-up

另外那篇文章也提到Vista SP1和Windows Server 2008就不會有這問題了..
要去裝Windows Server 2008ㄇ??..Disappointed..

星期一, 4月 07, 2008

(閃光文)台北透透跑..

呼呼..一大早..賴床賴床賴床..到了2點才出發..想趕那3:30前的皮膚科..衝衝衝..
3:20分到了..停好車..趕趕趕..呼呼..上樓去..案..3:35..休診啦..Crying..最好這麼準時啦..暈..
結果沒看到..真是低..

不過既然來到了台北..當然要來逛一下..順便陪婆婆去sogo買個衣服ㄅ..小菊花慢慢騎..路上還有看到可愛的千佩妹妹..
他們好像再辦化妝品試用的show說...

P1040774

接下來就逛sogo了..今天過然是假日..一堆人..這裡也擠..那裡也擠..不算是是逛得很舒服..

P1040776

不過在逛的時候有看到一件西裝..你們猜猜..這是小孩子的size..做的好精緻喔..不過也是超貴的..Dont tell anyone

P1040780

百貨公司人太多了..所以跟婆婆就轉移陣地..走去那還沒去過的"自由廣場"..Hot..

P1040788

很久沒有去了..去到那裡果然是一整個心曠神怡..讚啦..就是要大..數大便是美..感覺好多了..
外面還有在為西藏祈福的一群人..

P1040796

當然要雙雙對對的自拍一下啦..

P1040809

還有..看一下..好多好多的䗫蟻喔..哈哈..好寬闊的感覺..

P1040811

接下來進去那充滿"爭議的地方"..

P1040816

P1040818

Hot..哈..一整個詭異..一堆風箏..果然身歷其境比看電視的有感覺多了..不過..我發現民進黨這樣搞..
也是有他的道理的..就是..

P1040825

這是中正紀念堂的屋頂..XD..用國民黨的黨旗當作這裡的屋頂..難怪民進黨要在這亂搞..
(迷之聲..事出必有因..)
不過..撇開藍綠的爭議..政治的爭端..民主廣場(中正紀念旁)還真的是很讚的地方..有空一定要來這一下..超優的..

逛完了..累了..當然要上館子去吃得東西..我跟婆的構想是..去吃個酸酸辣辣的異國料理..
所以就想到那去南勢角的滇緬街去好了..走阿走阿..看阿看阿..發現一家..婆婆說那是非凡報過的...
那二話不說..當然衝啦..^^..

P1040829

P1040833

吃完..案..一整個油膩膩的...一點都不清爽..噁噁噁..哈哈哈..這不好吃..下次不來啦...

今天玩的很開心..也謝謝婆婆讓我這一天不在當阿宅..哈..Red heart