2012年4月7日 星期六

【SQL】 Case When Then 和 isNull的用法



ISNULL: 第一個參數如果取得的值為Null時,則用第二個參數當作其值


Case When Then: 以這個例子為例,如果OrderDetail.BookType抓到的值為'true'時,則傳回'電子檔',如果是'false'時,則傳回'書本',最後這個欄位名稱取名為'書本型態'

【C#】自訂控制項裡的button事件 如何讓上層的Form註冊


之前看了一篇文章,有提到如何實作,今天剛好把筆記補上

看標題可能有點難懂這篇在做什麼!?  先來解釋一下~

這是我做的控制項,按下按鈕後可以展開一個由CheckBox、Label、Button組成的小Item
然而動態的給該Item文字顏色之類的,只要寫屬性進去即可,但如果我要使用該控制項裡面的Button click事件該怎麼辦呢?

因為該組合出來的控制項雖然有click事件,卻不是我要的只有按下"+"號按鈕時才觸發的事件,原來可以透過委派來解決這個問題

委派大略來說就是訂閱者與發佈者,從這角度來看,該按鈕就是發佈者,而使用這個控制項的Form就是訂閱者


所以在控制項的類別裡寫下以下程式
C#版本
    //Button Click的事件是經由EventHandler來進行委派的
    //所以用該Handler註冊一個事件,我將該事件取名為Button_Click(這個是等等要給外面的Form註冊的)
    public event EventHandler Button_Click; 

    //在自己做的控制項裡面註冊該按鈕的Click事件
    this.btnDetail.Click += new EventHandler(btnDetail_Click);
    

    //將button_click事件轉出
    private void btnDetail_Click(object sender, EventArgs e)
    {

        //在該事件裡面寫下以下程式,簡單的說就是檢查自己做的事件有無訂閱者,如果有就將事件透過Invoke的方法轉發出去。
        if(Button_Click != null)
        {
            //利用Delegate轉出該Event給註冊於Button_Click的Event Handler
            Button_Click.Invoke(sender,e);
        }
    }

VB版
    '註冊給外面呼叫的事件
    Public Event Button_Click(ByVal sender As Object, ByVal e As EventArgs)
    Private Sub btnDetail_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnDetail.Click
         '用RaiserEvent進行委派
         RaiseEvent Button_Click(sender, e)
    End Sub
這樣使用這個控制項的From只要有註冊Button_Click事件就可以自訂該按鈕按下後的效果了