2016年1月29日 星期五

[CSS]利用CSS3與JQuery達成開合面板特效

測試的chrome版本: 48.0.2564.97
其他版本或瀏覽器, 可能會有呈現上的差異, 請適當的修改各處的CSS

目的:用一張圖靜態的圖搞定特效

1.滑鼠移入時三角形變亮 
2.點擊時, 旋轉三角形與展開區域









下面是原料的原始碼

●CSS
    <style type="text/css">
        /*補間動畫*/
        @keyframes arrow {
        0%   { transform:rotate(0deg);}   /*初始的呈現*/
        100% { transform:rotate(90deg); -webkit-filter: brightness(200%);} /*最終的呈現*/
        }
        @keyframes arrow_close {
        0%   { transform:rotate(90deg);}
        100% { transform: rotate(0deg); -webkit-filter: brightness(100%);}
        }

        /*圖片套用的樣式*/
        .test-arrow {
            animation-name: arrow; /*使用的補間動畫*/
            animation-duration: 0.5s; /*動畫時間長度*/
            transform:rotate(90deg); /*相對於原圖的旋轉角度*/
            -webkit-filter: brightness(200%); /*相對於原圖的亮度*/
        }

        .test-arrow-close {
            animation-name: arrow_close;
            animation-duration: 0.5s;
            transform:rotate(0deg);
            -webkit-filter: brightness(100%); /**/
        }
    </style>

●混雜著asp.net的html(編譯到網頁時, 還是會回到html)
         <table class="fastFunc" style="width: 90%;">
           <tr style="background-color: #7292CC; color: #FFFFFF;">
                <td>
                    <img id="i_arrow" class="i_toggle" src="../BlueTriangle_glow.png" />快速停用
                </td>
           </tr>
           <tr>
<td>
               <asp:Panel id="arrow" CssClass="p_toggle" runat="server" BackColor="#C6DAF8">
                  //(自由發揮)
</asp:Panel>
               </td>
</tr>
        </table>


 重這邊開始有區別, 這裡是jQuery與js主要運作的地方

第一種, 較直觀的方法(直接指定ID)

優:簡單不容易指錯, 在測試和規劃初期可以減少需排除的錯誤, 相當適合只用一次的功能
缺:想重複使用功能時, 會需要寫進所需的code, 讓檔案大幅成長

    <script type="text/javascript">
        $(document).ready(function () {
            $("#arrow").hide();
            $("#i_arrow").mouseover(function () { $(this).css("-webkit-filter", "brightness(200%)") })
            $("#i_arrow").mouseout(function () { $(this).css("-webkit-filter", "brightness(100%)") })

            $("#i_arrow").click(function () {
                $(".fastFunc").slideToggle(300);
                if (this.className == "test-arrow") {
                    this.className = "test-arrow-close";
                }
                else
                    this.className = "test-arrow";
            });
        });
    </script>


第二種, 較抽象的方阿 (利用this與遍歷)

優:只需寫一次, 並透過適當的條件選擇, 就能套用在不同區塊
缺:不熟悉selector或架構尚未定型的開發中頁面, 使用此方法反而會增加困擾

    <script type="text/javascript">
        $(document).ready(function () {
            $(".p_toggle").hide();
            $(".fastFunc .i_toggle").mouseover(function () { $(this).css("-webkit-filter", "brightness(150%)") })
            $(".fastFunc .i_toggle ").mouseout(function () { $(this).css("-webkit-filter", "brightness(100%)") })

            $(".fastFunc .i_toggle").click(function () {
                $(this).parents("tr").next().find(".p_toggle").slideToggle(300);
                if (this.className == "test-arrow")
                    this.className = "test-arrow-close";
                else
                    this.className = "test-arrow";
            })
        });
    </script>

可以注意看, 其實程式碼差不多, 而是差別在selector的寫法

2016年1月17日 星期日

[NuGet]用OpenXml在docx中套版列印 - 基本型

使用版本:
  • Visual Studio 2012
  • DocumentFormat.OpenXml v2.5

參考資料:


NPOI在excel中用起來還不錯, 但是Word中就... 不那麼直觀了(也許只是個人問題)

「基本型」就是有現成的Template, 僅是將[$...$]包夾的文字取代後Export
([$...$]是在黑暗執行緒中發現的, 覺得不錯就學起來了 :D)


步驟一:設定aspx中的控制項, 且產生Button1的Click事件
輸入的控制項使用TextBox, 按鈕的控制項使用Button

步驟二:撰寫Button1的Click事件
此段與黑大鎖寫近乎無異, 僅有綠色區域因需求而微調
綠框視控制項的設定而變, 綠線則是函數名, 結果與黑大的MakeDocx()差不多


 步驟三:撰寫editWordDoc函數
此處是參考「我如何...」編寫

到此就大功告成了

如果Export後,發現[$...$]沒有被取代

將*.docx改為*.zip去看「word→doucment.xml」(用可編輯的工具為佳, 個人是用記事本)
看是不是[$...$]不連續, 將多餘的地方刪除, 再存回docx就可以了


與OpenXml類似用途的NPOI介紹

2015年12月11日 星期五

[ASP.NET]從後台透用C#呼叫前台寫好的JavaScript function()

此文章不是如何在從*.cs中編寫一段js並到前台執行
而是在*.cs中, 使用一段前台已經寫好的js功能
此篇介紹的是作用於page內, 而非updatepanel中的js, updatepanel的請參見頁尾的msdn

假設前台(*.aspx)中有這麼一段<script>
    <script type="text/javascript">
      var optionSubjectBar = {
            'title': 'Nya~',
            'width': 200,
            'height': 300,
            vAxis: { minValue: 0 }
        };
        ...................
        function drawAxisTickColors() {
            var dataAudit = google.visualization.arrayToDataTable([
            chart.draw(dataAudit, optionAuditStackedBar);        }

        function clicktest() {
            var data = new google.visualization.DataTable();
            ...................
            chart.draw(data, optionAuditStackedBar);
        };
    </script>

在要執行該段js的C#語法中視需求插入即可
例如我想要使用「clicktest()」這個功能

(*.cs)後台
建構式為
public static void RegisterStartupScript( Page page, Type type, string key, string script, bool addScriptTags )
  • page:一般用「Page」就對了
  • type:一般用「GetType()」就對了
  • key:給後面的指令碼有個識別值, 像是ID般的存在, 不一定要跟function相同名稱
  • script: 當然就是要執行的function了,以這個例子就是輸入「clicktest()」,要直接寫一段程式碼也是可以
  • addScriptTage:true或false, 只是會不會加上<script>...<script>而已


ScriptManager.RegisterStartupScript(Page,GetType(),"clicktest","clicktest()",true)
如果在addScriptTags用false, 那就要寫成「<script>clicktest()<script>」
通常為了避免重複一直註冊key, 會多加上判斷式
-----------------------------------------------------------------------------------------------------------------------------------------------

if (!Page.ClientScript.IsStartupScriptRegistered("clicktest"))
        {
            ScriptManager.RegisterStartupScript(Page,GetType(),"clicktest","<script>clicktest()</script>",false)
        }
-----------------------------------------------------------------------------------------------------------------------------------------------

對於單純的page也許不太需要, 但是會不斷刷新的ajax就可以節省頻寬喔

使用UpdatePanel的話,請參考這MSDN的設定:(點我前往)
另外這篇文章也不錯,說明三種註冊方法的差異(本文只使用其中一種):動態註冊JavaScript至Client端


參考資料:



2015年11月26日 星期四

[EEP]Srvtools.WebDataSource元件Master發生錯誤,無法找到欄位:XXX的值

有些欄位作為Index, 又不想讓使用者看到時, 有很多種作法
像是用「System.Data.*」操作或是ViewState等狀態管理

這篇介紹兩個簡單的方法,各有其特色




  • HiddenField:還想利用JQuery或在Client端對其有動態影響時
  • Visible=False:Client看不到, 一定要PostBack
習慣用VS編寫的話,通常會直覺的利用Visible=False
但有可能導致使用者在操作WebFormView時出現
「Srvtools.WebDataSource元件Master發生錯誤,無法找到欄位:XXX的值」

這時先檢查一下該控制項的Bind設定
(錯誤)  <asp:Label ID="Label1" runat="server" Text='<%# Eval("CustID") %>'  Visible="False"></asp:Label>
(正確)  <asp:Label ID="Label1" runat="server" Text='<%# Bind("CustID") %>'  Visible="False"></asp:Label>

如果連這樣都無法解決,對於該欄位又沒有資安考量時,可以考慮使用「HiddenField」
HiddenField是VS內建的控制項

將其插入ItemTemplate的樣板(或其他有需求的樣板模式)
<asp:HiddenField ID="HiddenField1" runat="server" Value='<%# Bind("CustID") %>' />

由於該程式碼經編譯後,在Client端看的到
會轉換成「<input type="hidden" name="WebFormView1$HiddenField1" id="WebFormView1_HiddenField1" value="1">」
與利用JQuery的hide();有相同的缺點,如果是資安考量的欄位,請勿直接使用「HiddenField」

2015年11月24日 星期二

[JQuery]視條件隱藏GridView中同列首欄的內容


功能的訴求,是送出後仍能檢視,但不能再做修改(除非被更高權限的退回)
(大致上如下圖, 點下「to QC」後,會變成「Keyin OK!」,且轉為唯讀模式)

$(".AR_OK").css("color",
  function () {
        if ($(this).text() > 0) {
            $(this).prev().hide();
            $(this).text("Keyin OK!");

            $(this).parents("tr").first().find(":image").hide();
            return "green";
        }
        else {
            $(this).hide();
            return "black";
        }
    }
 )



這功能的實作,是利用class為「AR_OK」觸發
原本應該是「$(selector).css(attr, value)」,在給value值時,可以利用function(){}做變化
因為不是統一變化, 故有用到「$(this)」,對於選擇性變化的很好用
是沒用each()的另一種遍歷

【Step欄位】
先做if判斷, 是true則轉為唯讀並用綠色的「Keyin OK!」提示使用者, 並隱藏「to QC」的按鈕
如果判斷false, 則不顯示文字,留著「to QC」的按鈕

【第一欄】
四個選一個用吧, 越上面是越土法煉鋼
由於我要隱藏的剛好都是「input type=image」
Selector的部分可以用「:image」直接撈

$(this).parent().prev().prev().prev().prev().prev().prev().prev().children().hide();
$(this).parent().parent().first().children().children(":image").hide();
$(this).parents("tr").first().children().children(":image").hide();
$(this).parents("tr").first().find(":image").hide();

利用.parents("tr")一直退到<tr>
.first()表示要第一個
然後用find(":image")省略n次的children()直接到元素
至於.hide()就隨喜好了, 要改變style或繼續串燒都可以直接接