2008年11月27日 星期四

何謂「委派(Delegate)?」(11.27)

委派(Delegate):
  1. 委派就如中文表面的意思一樣,就是將我們定義好的方法,透過委派的物件,來執行該方法。
  2. 在我們一般寫程式時,也許甚少會用到委派的東西,但,若你在開發一些共用元件,需要提供方法、事件讓別人使用時,就應該要透過委派來達到安全性及共用性。
範例:

//以下是一個四則運算的簡單範例


    delegate int arithmetic(int num1, int num2); //定義委派類型


    protected void Page_Load(object sender, EventArgs e)
    {
        //先宣告委派
        arithmetic ari=null;

        //設定算術原則
        string fun="/";

        switch (fun)
        {
            //依照fun所給的算術原則,將該算術原則的方法,指派給「ari」
            case "+":
                ari = new arithmetic(this.add);
                break;
            case "-":
                ari = new arithmetic(subtract);
                break;
            case "*":
                ari = new arithmetic(multiply);
                break;
            case "/":
                ari = new arithmetic(divide);//實作委派
                break;
                //(這些方法,必須也要跟定義委派類型的是相同的喲。

就是說,也必須有回傳int,及有兩個數值參數。)
        }

        int ccc = ari(6, 3);//這時候,只要統一用「ari」就可以呼叫對應的方法了。

    }


    private int add(int a,int b)
    {
        //加
        return a + b;
    }

    private int subtract(int a, int b)
    {
        //減
        return a - b;
    }

    private int multiply(int a, int b)
    {
        //乘
        return a * b;
    }

    private int divide(int a, int b)
    {
        //除
        return a / b;
    }



另外,委派也有「組合」的功能,可以將數個方法,一起組合起來,依序執行。
例:
ari += new arithmetic(this.add);
ari += new arithmetic(this. subtract);

如此的話,程式便會先執行「add」完後,接著執行「subtract」。另外,有了「+」,也可有「-」

ari += new arithmetic(this.add);
ari += new arithmetic(this. subtract);
ari -= new arithmetic(this.add);

經過了「-」的動作,原本加上的「add」方法,又被移除了,於是就只會執行「subtract」而已。


2008年11月19日 星期三

按Enter,就執行我要的按鈕(11.19)

常常在網頁中,例如「登入」「查詢」的功能時,
我們會希望輸入完資料後,
按下「Enter」,就能執行登入或查詢的功能,
而不是用滑鼠去點選按鈕,
以往,我們要達到這種目的,
需要用javascript判斷我們所鍵入的按鍵key值
再去觸發該按鈕的事件。

現在,.Net 2.0幫我們包好了我們要的功能囉。

我們可在「Form」標籤裡的「defaultbutton」屬性,
設定我們要執行按鈕的ID即可
又或是可在「Panel」的 ServerControl中的「DefaultButton」也可喲。

使用Panel的話,彈性可以更廣,因為,每個網頁可以有許多個Panel呀
例如,一個網頁中,同時放有登入及查詢的功能,我們就可將其各用Panel包起來
這樣,就可以各自跑各自的DefaultButton了。

用Panel的話,在MasterPage的話,也可通用。



GridView的表頭跨欄設計(11.19)

這個功能,在Google用「GridView 跨欄」去搜尋,就會有一大堆的文章。
對這功能來說,是個老梗了啦!
現下,我便引用某位大大的文章,及配合自己的實例,來幫助註解一下吧。


if (e.Row.RowType == DataControlRowType.Header)
{
TableCellCollection oldCell = e.Row.Cells;
oldCell.Clear();//將原有的表頭格式移除

//產生多重表列的第一列
GridViewRow headRow = new GridViewRow(0,0, DataControlRowType.Header, DataControlRowState.Insert);

//第一欄
TableCell head2Cell = new TableCell();
head2Cell.Text = "單位";
head2Cell.BackColor = row1color();//自訂的方法用以統一取得色彩
head2Cell.HorizontalAlign = HorizontalAlign.Center;
head2Cell.RowSpan = 2;//所跨的欄數
headRow.Cells.Add(head2Cell);//新增自製的儲存格


//第二欄
head2Cell = new TableCell();
head2Cell.Text = "群組";
head2Cell.BackColor = row1color();
head2Cell.ColumnSpan = 8;//所跨的欄數
head2Cell.HorizontalAlign = HorizontalAlign.Center;
headRow.Cells.Add(head2Cell);//新增自製的儲存格

//第三欄
head2Cell = new TableCell();
head2Cell.Text = "聯絡人";
head2Cell.BackColor = row1color();
head2Cell.ColumnSpan = 3;//所跨的欄數
head2Cell.HorizontalAlign = HorizontalAlign.Center;
headRow.Cells.Add(head2Cell);//新增自製的儲存格

//第四欄
head2Cell = new TableCell();
head2Cell.Text = "行事曆";
head2Cell.BackColor = row1color();
head2Cell.ColumnSpan = 3;//所跨的欄數
head2Cell.HorizontalAlign = HorizontalAlign.Center;
headRow.Cells.Add(head2Cell);//新增自製的儲存格

//將自製的資料列新增上去
GridView1.Controls[0].Controls.Add(headRow);

//產生多重表列的第二列
headRow = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Insert);

#region 群組裡的欄位

//用法都與第一列相同
head2Cell = new TableCell();
head2Cell.Text = "使用量";
head2Cell.BackColor = row2color();//自訂的方法用以統一取得色彩
headRow.Cells.Add(head2Cell);

head2Cell = new TableCell();
head2Cell.Text = "成員數";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);

head2Cell = new TableCell();
head2Cell.Text = "員工數";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);

head2Cell = new TableCell();
head2Cell.Text = "通訊錄量";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);

head2Cell = new TableCell();
head2Cell.Text = "檔案總數";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);

head2Cell = new TableCell();
head2Cell.Text = "總檔案量";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);

head2Cell = new TableCell();
head2Cell.Text = "檔案下載次數";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);

head2Cell = new TableCell();
head2Cell.Text = "下載磁碟總量";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);

#endregion

#region 聯絡人裡的欄位

head2Cell = new TableCell();
head2Cell.Text = "使用人數";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);

head2Cell = new TableCell();
head2Cell.Text = "聯絡人數量";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);

head2Cell = new TableCell();
head2Cell.Text = "同步次數";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);

#endregion

#region 行事曆裡的欄位

head2Cell = new TableCell();
head2Cell.Text = "使用人數";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);

head2Cell = new TableCell();
head2Cell.Text = "events_personal";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);

head2Cell = new TableCell();
head2Cell.Text = "events_group";
head2Cell.BackColor = row2color();
headRow.Cells.Add(head2Cell);

#endregion

GridView1.Controls[0].Controls.Add(headRow);


完成後,我們的資料表頭,就會變成下列樣式: