BloggerAds

2011年7月27日 星期三

C#將DataTable做Group By並取SUM、AVG、COUNT的方法(不用LINQ)

LINQ是個很方便的東西,但在比較舊的環境(.Net Framerwork 3.0以下的版本),是沒辦法使用LINQ的,這時要將DataTable做Group By可是很麻煩的一件事,下面就提供範例:
DataTable dt = new DataTable();    //原來的資料
dt = Get(); //取得資料,PS. Get()是我自己寫的Function,要記得換成你取得DataTable的function

//將原來的DataTable做Distinct並複製到新DataTable,ToTable的第一個參數是設定是否
//要做Distinct,當然要設成true,其他參數是要做Group By的欄位名稱
DataTable dtGroup = dt.DefaultView.ToTable(true, "column1", "column2");

//開始加欄位
dtGroup.Columns.Add("CountColumn");
dtGroup.Columns.Add("SumColumn");
dtGroup.Columns.Add("AvgColumn");

int count = 0;

for (int i = 0; i < dtGroup.Rows.Count;i++) {
    //取資料,用String是因為上方加欄位時,沒指定型別為數字
    string strCount = dt.Select("column1='" + dtGroup.Rows[i]["column1"].ToString() + "'").Length.ToString();
    string strSum = dt.Compute("SUM(column3)", "column1='" + dtGroup.Rows[i]["column1"].ToString() + "'").ToString();
    string strAvg = dt.Compute("AVG(column4)", "column1='" + dtGroup.Rows[i]["column1"].ToString() + "'").ToString();

    //設定資料
    dtGroup.Rows[i]["CountColumn"] = (strCount == "" ? "0" : strCount);
    dtGroup.Rows[i]["SumColumn"] = (strSum == "" ? "0" : strSum);
    dtGroup.Rows[i]["AvgColumn"] = (strAvg  == "" ? "0" : strAvg );       
}
最後dtGroup就是Group By後的資料了。

用jQuery取得RadioButtonList所選的值

開發.NET程式時,常常會使用到RadioButtonList控制項,在很多狀況下常需要依照使用者所選的值去做一些判斷或動作,雖然.Net本身就有OnSelectedIndexChanged事件可以用,搭配UpdatePanel等,可以做到不用PostBack的功能,但用jQuery也是可以寫的很簡單。

若使用的是RadioButtonList控制項,aspx內容如下:

<asp:RadioButtonList ID="rblTest" runat="server" >
    <asp:ListItem Text="1" Value="1" Selected="True" />
    <asp:ListItem Text="2" Value="2" />           
</asp:RadioButtonList>
產生的Html語法會長成這個樣子:
<table id="rblTest" border="0">
<tr>
<td><input id="rblTest_0" type="radio" name="rblTest" value="1" checked="checked" /><label for="rblTest_0">1</label></td>
</tr><tr>
<td><input id="rblTest_1" type="radio" name="rblTest" value="2" /><label for="rblTest_1">2</label></td>
</tr>
</table>
有看到吧? 產生的input物件,name 都是 rbTest,但id卻是以rbTest_開頭,再加上從0開始的序號,所以如果要使用jQuery取得所選的值的話,可以有兩種方法:
1.用id開頭取得:
$("input[id^='<% =rblTest.ClientID %>']:checked").val()
2.用name取得:
$("input[name='<% =rblTest.ClientID %>']:checked").val()
兩種都可以試試。

2011年7月15日 星期五

MySQL使用暫存table時出現Error Code: 1137 Can't reopen table: 'XXX'錯誤

在MySQL使用暫存Table時,若出現 Error Code: 1137 Can't reopen table: 'XXX' 的錯誤
表示你使用了像下列的語法:
CREATE TEMPORARY TABLE tempTable
SELECT * FROM tableA

INSERT INTO tempTable
SELECT * FROM tableB
WHERE tableB.`cname` IN (SELECT `cname` FROM tempTable);
MySQL中,是不允許一段語法裡,做出像是遞迴的動作的語法,其他資料庫我沒試過,所以不知道可不可以這樣做,而會出現這種錯誤,通常都是因為疏忽(就是在說我自已…= =),建議解決方式:再用一個暫存Table來存原本暫存Table的值,如下:
CREATE TEMPORARY TABLE tempTable
SELECT * FROM tableA

CREATE TEMPORARY TABLE tempTable2
SELECT * FROM tempTable

INSERT INTO tempTable
SELECT * FROM tableB
WHERE tableB.`cname` IN (SELECT `cname` FROM tempTable2);

當 $(document).ready 碰上UpdatePanel

在 ASP.NET的開發中,UpdatePanel 是一個讓人又愛又恨的存在,讓人很方便使用,卻又常會造成一些問題。其中一個問題就是當UpdatePanel的(Partial) PostBack觸發後,你會發現你在$(document).ready中所設定的事件、屬性、ccs…等,全部都消失了,畫面並沒有reload,但你設定的動畫、mouseover、mouseout、watermark…等,卻都失效,沒有作用了。下面就是為了應對這種問題的解決方式:
$(document).ready(function() {
     pageLoad();
   
     Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function() {
            pageLoad();
     });
});

function pageLoad() {
    //你要執行的程式碼
}
加入Sys.WebForms.PageRequestManager.getInstance().add_endRequest 這個事件,並重新執行一次原本$(document).ready所執行的程式就可以解決這個問題了。

如果你要在UpdatePanel的(Partial) PostBack執行前,去處理一些事件,像是記錄當下的數值之類的,你可以用 Sys.WebForms.PageRequestManager.getInstance().add_beginRequest這個事件來做處理。

如果你在$(document).ready中有設定css的class,這個方式在Chrome、Firefox等瀏覽器下,也可以確實的解決問題。但在IE下,有時你會發現,不管你怎麼重新設定css class,好像都沒作用,javascript事件、function、甚至用$(selector).css()來設定css,全部都有跑,但唯獨設定css class的部份卻跟沒跑一樣。

如果你的css class是寫在網頁中,那這個問題的解決方式有二:
1.將你的css屬性,全改用$(selector).css()來設定。
2.將你class的style區段移至<head>中,這樣就可以解決問題了,真是莫明奇妙...

參考資料:
http://stackoverflow.com/questions/256195/jquery-document-ready-and-updatepanels
http://stackoverflow.com/questions/1732164/losing-css-class-added-through-jquery-on-updatepanel-partial-postback
http://sudheerkondraguntaprogramming.blogspot.com/2011/05/issue-with-css-stylesheet-and.html

2011年7月1日 星期五

jQuery UI Modal Dialog 中ASP:Button 無法PostBack的解決方式

如果有在.NET網頁(aspx)中使用jQuery UI 的Modal Dialog Plugin的人,應該會發現,若將ASP:Button控制項放在Dialog中,裡面的Button按下去是不會PostBack的,google了一下後,發現只要加一行程式就可以解決了,解決方式如下:
$("#btnA").click(function() {                             
    $("#divDialog").dialog({    //顯示Modal Dialog
        title: 'title',
        modal: true
    });
    //重點在這
    $("#divDialog").parent().appendTo($("form:first")); 
});          

$("#btnCancel").click(function() {
    $("#divDialog").dialog("close");   //關閉Modal Dialog
});

參考資料:
http://stackoverflow.com/questions/568784/jquery-modal-form-dialog-postback-problems