2010年9月4日 星期六

jQuery Collapse - 點擊標題後可展開或關閉內容

jQuery Collapse - 點擊標題後可展開或關閉內容

~程式段~
<head id="Head1" runat="server">
<script type="text/javascript">
$(function()
{
    $(".pp").click(function(event)
    {
       event.preventDefault();//取消預設事件
       $(this).next("div").slideToggle(100);//通過高度變化來切換所有匹配元素的可見性,並在切換完成後可選地觸發一個回調函數。
       //$("#caja").slideDown();//通過高度變化(向下增大)
       //slideToggle(speed,callback)
       //這裡的 speed (String|Number): (可選) 三種預定速度之一的字符串("slow", "normal", or "fast")或表示動畫時長的毫秒數值(如:1000)
       
    });

    $("#mostrar2").click(function(event)
    {
       event.preventDefault();//取消預設事件
       $("#caja2").slideToggle(1);//通過高度變化來切換所有匹配元素的可見性,並在切換完成後可選地觸發一個回調函數。
       //$("#caja").slideDown();//通過高度變化(向下增大)
       //slideToggle(speed,callback)
       //這裡的 speed (String|Number): (可選) 三種預定速度之一的字符串("slow", "normal", or "fast")或表示動畫時長的毫秒數值(如:1000)
       
    });

    $("#caja a").click(function(event)
    {
       event.preventDefault();//取消預設事件
       $("#caja").slideUp("fast",function(){alert("bye bye!")});// 通過高度變化(向上減小)
    });
   
    $("#caja2 a").click(function(event)
    {
       event.preventDefault();//取消預設事件
       $("#caja2").slideUp("fast",function(){alert("bye bye2!")});// 通過高度變化(向上減小)
    });
   
    $("#webA").click(function(event)
    {
       event.preventDefault();//取消預設事件
       alert("大家好!!!");
    });
   
   
});

//使用的css
<style type="text/css">  
body {  
    font-family: Verdana, Arial, Helvetica, sans-serif;
    font-size: 11px;
    color: #666666;    
}  
a{color:#993300; text-decoration:blink;}  
#caja {
    width:70%;
    display: none;
    padding:5px;
    border:2px solid #FADDA9;
    background-color:#FDF4E1;
}  
a2{color:#993300; text-decoration:blink;}  
#caja2 {
    width:70%;
    display: none;
    padding:5px;
    border:2px solid #FADDA9;
    background-color:#FDF4E1;
}

#mostrar{  
    display:block;
    width:70%;
    padding:5px;
    border:2px solid #D0E8F4;
    background-color:#ECF8FD;
}
 #mostrar2{  
    display:block;
    width:70%;
    padding:5px;
    border:2px solid #00AA66;
    background-color:#66DD78;
}
</style>

<body>
    <form id="form1" runat="server">
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="XmlDataSource1"><ItemTemplate>
    <a href="#" id="mostrar" class="pp">Jolin護舊愛 信周董不沾賭
  <div id="caja" >
       <ahref="#" class="close">[x]<asp:Label ID="Label1" runat="server" Text='<%#Eval("id") %>'>
       <asp:Button ID="Button1" runat="server" Text="Button" />
       <input id="Button2" type="button" value="button" />「Jolin」蔡依林昨天為新專輯辦慶功,對於舊愛「周董」周杰倫近來被爆泡賭場狂輸上億台幣,
       Jolin為他澄清:「應該不可能吧,有點誇張。」至於她與眾追求者進展得如何,是否交換了MSN帳號?
       她則笑著反問:「這很重要嗎?拒絕回答。」等同間接認了已經有人擁有她的帳號,彼此已邁入網交階段。
       慶30歲 申請1週生日假Jolin最近為新專輯連續工作4個月,又喊著想放長假,但她也知一切是「肖想」:
       「年底要辦演唱會,要放也是明年。」因此9月中乾脆藉生日名義,向公司申請1週假期,「畢竟是20歲嘛
       (實際為30歲),一定要慶祝。」
       今年希望追求者送鑽戒嗎?Jolin則說:「我自己買得起。」她坦言價錢不是重點,重要的是送的人。
       教折手舞 大嘴巴40哀嚎Jolin之前上CHANNEL[V]「音樂這個讚」,教大嘴巴40跳voguing舞,40勾不到
       手痛到哀哀叫,「好痛!這樣超像在復健的。」Jolin還淘氣上前拉他一把,讓已經滿頭大汗的40叫得
       更大聲,趁廣告空檔藉機尿遁。</p>
    </div>
    </ItemTemplate></asp:Repeater>
    <a href="#" id="mostrar2">「非A型性格」求職最吃香</a>
    <div id="caja2">
       <a href="#" class="close">[x]</a>
       <p>經歷跳樓事件後,富士康重新招募員工,招考試題中,出現了有關抗壓特質的測試,例如「周圍有喧嚷聲,能不能馬上睡?」
       從題目看來,富士康想要測試,這些面試者對於一般人不太在意的事,是否也會產生激烈的壓力反應?也就是說,富士康很可能
       要找的是心理學中「非A型性格」的人。
       一九六○年代,兩位心臟科醫師費立德曼與羅森曼定義了「A型性格」的特性,他們發現容易罹患心血管疾病的人,通常具有一套
       共同的特質:傾向於工作狂熱、全力以赴,重視做事完美無缺,好競爭且懷有敵意,卻又害怕失敗。
       之後,心理學家研究發現,具有「A型性格」的特質,容易感受到壓力,如果他們感覺事情不在自己掌控之中,便會過分投入工作,
       時時刻刻都保持警戒,血壓也居高不下。
       反之,「非A型性格」即使在高壓的環境中,仍能不慌不忙、隨和易處,也沒有爭強好勝的壓力,在緊張之後,還能愉快的休息。
       也就是說,富士康希望新進的員工,他們的心理素質天生就比較能抗壓,即俗話說的「神經比較大條」,如此,當面對治軍嚴謹、
       一絲不苟、處處要找出細節裡的魔鬼富士康主管時,才承受得了。
       抗壓風並不是只有大陸,回頭看台灣,企業主面對突如其來的變化壓力,也有員工執著於求好心切而自殺,所以在人才募集,同樣
       有偏愛抗壓能力高者的趨勢。
       台灣的鴻海,徵才條件更早即趨向「高抗壓」。在富士康尚未發生跳樓事件前,鴻海宣稱,今年將有許多新計畫持續拓展,人才需
       求很大,希望找到抗壓性好「打不走、罵不退」的青年才俊。
       不只鴻海,近來新奇美、廣達、宏碁、英業達等科技大廠開出的徵才條件,不約而同,都把「抗壓性佳」列為必備資格。今年台積
       電徵才也突出了「抗壓力」這個主題,「台灣學生聰明程度不輸國外,但是抗壓明顯較弱。」台積電人力資源經理魏烈說,公司裡
       曾有博士提出想法時被多問幾句就失去自信;也有新人看到同事被責備,便難過起來,抗壓性不足。
       因此台積電的用人政策,除了看一般的IQ(智力商數)、EQ(情緒商數)外,更重視求職者的AQ(逆境商數),因為高科技業不斷
       追求技術領先,工作承受很大的壓力,逆境商數高者,才能面對劇烈變化。</p>
    </div>
    <p></p>
    <a href="Default.aspx" id="webA">回首頁</a>
       <asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/XMLFile.xml">

   


~註解~
$(".pp")      //抓取class=pp的資料
$(this).next("div")    //抓取下一層資料中div元件
$("#mostrar2")        //抓取id=mostrar2的資料

~範例~
http://140.96.149.85/JQuery/WebJQuery.aspx

2010年4月8日 星期四

Reporting Service

一、設計報表
新增一個報表檔(.rdl)
<Ⅰ>資料-->設定資料來源(dbserver、dbname、username、password等),然後填寫sql或讀取stored procedure去篩選報表資料
<Ⅱ>配置-->拉好所需的報表介面後,開始填入報表內容 。
報表內容:
    頁首、頁尾:參數中的全域參數(ex:pagenum、reportname)只能用在此處,不能放在主體。
                    table元件不可以放在此處,欄位的值也不可以放在此處。
                    使用textbox時,若內容的值一定要用欄位,可以將該欄位的值設成報表參數,再引用該報表參數到textbox。

ex:CarCategory是sql產生的欄位值之一,因為在頁首不能使用,所以加入一個參數,然後將隱藏、允許Null值勾選, 允許空白值預設
        就有勾選,接著可用的值跟預設值都設成"從查詢",然後資料集、值欄位設定好就可以了



    主體:使用table元件時,要注意header跟footer只能欄合併,不能列合併,所以要設計比較複制的header或footer,
            可以在頁首或頁尾設計,運算式運用可以參考http://technet.microsoft.com/zh-tw/library/ms157328.aspx
            若需要固定excel的列高時,需要將table元件的detail每個欄位CanGrow、CanShrink皆設為false
            匯出excel時才有效果,參考http://www.kodyaz.com/articles/reporting-services-excel-rendering-autogrow.aspx

<Ⅲ>預覽-->觀看結果

二、在.NET上使用報表
<Ⅰ>以url方式直接產生報表
String scriptString = string.Format(@"
                            <script language=JavaScript>
                                <!-- begin
                                    window.open('http://localhost/ReportServer?/DirectoryName/FileName&rs:Format=excel&rs:ClearSession=true&rc:Parameters=false&ApplyNum='123456','','Width:400,Height:300,center:yes,status:no,scrollbars=no');
                                //end -->
                            </script> ");
            this.RegisterStartupScript("s", scriptString);
//DirectoryName 設置在report server上的資料夾
//FileName 報表名稱
//rs:Format=excel 這個參數是控制文件的格式,要轉出pdf則改為pdf,省略不寫則show出報表畫面,可以從所有格式中選擇其一匯出
//rc:Parameters=false 設為false時不會出現輸入參數的訊息
<Ⅱ>以ReportViewer元件呈現
        類似DataSource元件,拉進去後,填好資料來源、報表連結等資料就可以呈現。

-----------------------------------------分  格  線----------------------------------------分  格  線---------------------------------------------------
一般製作報表只需要上述兩點即可,接下來是要進行其他用途時才使用。

進行下面步驟的目的:
原本報表匯出時是直接給user點選匯出,但為了進行檔案內容的變更,所以先行將報表改成匯出到server
上(就是下述第三點),
然後再使用應用程式去開啟excel,變更格式後關閉(第四點),接著匯出(第五點)給user。                                                             



三、將報表直接存於server上
1.在專案新增web參考(webReference)=>ReportExecution2005
2.程式段
            localhost.ReportExecutionService rs = new localhost.ReportExecutionService();  //localhost為引用的webReference Name
            rs.Credentials = new System.Net.NetworkCredential("username", "password");

            string reportPath = "/Certificate/RptCertificate_G4"; //在report server上的報表檔案路徑
            string format = "EXCEL";
            string savePath = "D:\\Temp\\ReportTest.xls"; //儲存在server的資料夾路徑

            Byte[] result;
            localhost.ParameterValue[] parameters = new localhost.ParameterValue[1]; //這邊是報表參數,視其所需來增減
            parameters[0] = new localhost.ParameterValue();
            parameters[0].Name = "ApplyNum";
            parameters[0].Value = lblApplyNum.Text.Trim();
            string mimeType;
            localhost.Warning[] warnings = null;
            localhost.ParameterValue[] reportHistoryParameters = null;

            string[] streamIDs;
            string encoding;
            string devInfo = @"<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>"; //false為不顯示報表工具
            string historyId = null;
            localhost.ExecutionInfo execInfo = new localhost.ExecutionInfo();
            localhost.ExecutionHeader execHeader = new localhost.ExecutionHeader();
            string SessionId;
            string extenstion = "";
            rs.ExecutionHeaderValue = execHeader;

            try
            {
                execInfo = rs.LoadReport(reportPath, historyId);
                rs.SetExecutionParameters(parameters, "en-us");
                SessionId = rs.ExecutionHeaderValue.ExecutionID;

                result = rs.Render(format, devInfo, out extenstion, out mimeType, out encoding, out warnings, out streamIDs);
                execInfo = rs.GetExecutionInfo();
                FileStream stream = new FileStream(savePath, FileMode.Create);
                stream.Write(result, 0, result.Length);
                stream.Close();
            }
            catch (Exception ex)
            {
                string s = ex.Message;
            }
 
四、將儲存於server上的excel檔進行修改
<Ⅰ>直接使用Application開啟excel進行修改

加入參考=>Microsoft.Excel 11.0 Object Library

命名空間
using Microsoft.Office.Interop.Excel;
using System.Configuration;
using System.Reflection;
using System.Diagnostics;
using System.Runtime.InteropServices;

程式段
object missing = Missing.Value;
Excel.ApplicationClass app;
Excel.Workbook book;
Excel.Worksheet sheet;
Excel.Range ra;

app = new Excel.ApplicationClass();
try
{
    book = app.Workbooks.Open(savePath, missing, missing, missing, missing, missing,
    missing, missing, missing, missing, missing, missing, missing, missing, missing);

    //得到WorkSheet
    for (int i = 0; i < book.Sheets.Count; i++)
    {
        sheet = (Excel.Worksheet)book.Sheets.get_Item(i + 1);

        sheet.Rows.RowHeight = 36;
        sheet.UsedRange.Rows.RowHeight = 36;
        string aa = sheet.Cells[28, 1].ToString();
        string ab = sheet.get_Range(sheet.Cells[28, 1], sheet.Cells[28, 1]).Text.ToString();
        string ac = sheet.get_Range(sheet.Cells[28, 1], sheet.Cells[28, 1]).RowHeight.ToString();
        sheet.Cells[26, 1] = "1";
        sheet.Cells[29, 1] = "1";
        //調第27列(車型名稱最下面那列)
        if (reportPath == "/Certificate/RptCertificate_G4")
        {
            sheet.get_Range(sheet.Cells[27, 1], sheet.Cells[27, 1]).RowHeight = 24;
            //調內容那八列
            sheet.get_Range(sheet.Cells[28, 1], sheet.Cells[35, 1]).RowHeight = 27;
        }
        //設定顏色
        sheet.get_Range("B:B", Type.Missing).Font.Color = 255;
        //合併儲存格
        sheet.get_Range(sheet.Cells[37, 1], sheet.Cells[39, 1]).MergeCells = true;
        //得到使用過的欄位數目
        System.Runtime.InteropServices.Marshal.ReleaseComObject((object)sheet);
    }
    book.Close(true, Type.Missing, Type.Missing);
    app.Workbooks.Close();
    System.Runtime.InteropServices.Marshal.ReleaseComObject((object)book);
}
catch (Exception es)
{
    throw es;
}
finally
{
    app.Quit();
    try
    {
        IntPtr t = new IntPtr(app.Hwnd);
        int k = 0;
        GetWindowThreadProcessId(t, out k);
        System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k);
        p.Kill();
    }
    catch(Exception et)
    {
        string bo = et.Message;
    }

優點:可以直接修改excel的屬性,不會變動到整個資料格式。
缺點:process關不掉,會造成記憶體空間不足

<Ⅱ>使用NPOI修改excel
    利用記憶體讀取excel的資料後,另外匯出到另一個excel,而且可以設定excel的屬性。
參考如下
http://selene-tw.blogspot.com/2010/01/npoi.html

優點:不用擔心process關不掉的結果。
缺點:如果是複雜的報表格式,要一一重新設定格式,非常不適用,與其用報表設計完再從這裡進行修改,倒不如直接在這裡土法設計出報表格式,所以這個方法比較適用簡單的報表資料匯出


五、匯出檔案
            //開啟在server上的excel檔提供使用者下載或存檔
            System.IO.FileInfo fileinfo;
            string sFileName = "D://Temp//" + lblApplyNum.Text.Trim() + ".xls";
            fileinfo = new System.IO.FileInfo(sFileName);
            if (fileinfo.Exists)
            {
                Response.ClearHeaders();
                Response.Clear();
                string attachment = "attachment; filename=" + lblApplyNum.Text.Trim() + ".xls";
                Response.AddHeader("Accept-Language", "zh-tw");
                Response.AddHeader("Content-Disposition", attachment);
                Response.AddHeader("Content-Length", fileinfo.Length.ToString());
                Response.ContentType = "application/ms-excel";
                Response.WriteFile(fileinfo.FullName);
                Response.Flush();
                //刪除temp中該檔案
                fileinfo.Delete();
                Response.End();
            }
            string scriptString = string.Format(@"
                    <script language=JavaScript>
                    <!-- begin            
                     window.open('{0}');
                    //end -->
                    </script>
                    ", savePath);
            this.RegisterStartupScript("s", scriptString);

結論:由於第四點的兩種方法在實作上各有困難點,所以可以欣賞欣賞就好,慶幸的是最後格式的問題
         在報表中找到了解決方法,就是第一點在配置時的本體找到的固定excel列高方法。