2008年11月21日 星期五

DataView To DataTable

在 .Net 2.0 提供了 SqlDataSource 簡化了存取 SQL Sever 的操作。但對於回傳值的使用,常見的是 DataView 與 DataReader。但如果我們需要對所回傳資料進行資料的異動處理時,DataView真的就很不方便了。

還好,在 .Net 2.0 之後的 DataView 有強化了其功能,增加一個方法 DataView.ToTable ( ) ,可以讓你輕鬆的轉型為 DataTable。

2008年11月11日 星期二

showmodaldialog 檔案下載沒有反應

最近發現使用 showmodaldialog 時,雖然在 header 裡面有放 <base target="_self" /> 來處理 postback 的事件,但只要遇到有檔案下載的時候,不管怎麼點選都沒任何反應。可是改成 FireFox 就正常。另外,不使用 showmodaldialog 而是直接開啟那頁,又正常。

在網路上剛好找到一位跟我同病相憐的人,他介紹了一個完美的解決方法。


而我也修改了自己的程式如下:



<asp:HyperLink ID="lnk_File" Target="ifrTarget" runat="server"

NavigateUrl='<%# MakeURL(DataBinder.Eval(Container.DataItem,"ga_id")) %>'

Text='<%# Eval("ga_filename") %>'></asp:HyperLink>



<iframe name="ifrTarget" id="ifrTarget" width="0" height="0"></iframe>

主要,是在原先下載的鏈結裡,設定 target ,並指向自定的一個空的 iframe 。這樣就可以正確的執行我想要的下載功能了。

2008年11月7日 星期五

GrideView 實現跨欄作法

一個透過 GridView 達到跨欄效果的方法:
書名作者備註
Name1Author1跨欄資料
Name2Author2
Name3Author3
Name4Author4
Name5Author5


在 aspx 頁面,放置一個 GridView


<asp:GridView ID="gv" BorderColor="black" runat="server" AutoGenerateColumns="False" OnRowDataBound="gv_RowDataBound">
<Columns>
<asp:BoundField DataField="BookName" HeaderText="書名" />
<asp:BoundField DataField="Author" HeaderText="作者" />
<asp:BoundField HeaderText="備註" />
</Columns>
</asp:GridView>


定義自定的類別,以供 GridView 當資料來源


public class CBook
{
private string _BookName = string.Empty;
private string _Author = string.Empty;

public string BookName
{
get { return _BookName; }
set { _BookName = value; }
}

public string Author
{
get { return _Author; }
set { _Author = value; }
}
}


.cs 的程式


ArrayList alBook = new ArrayList();

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
InitBookData();
gv.DataSource = alBook;
gv.DataBind();
}
}

private void InitBookData()
{
CBook cb = null;

for (int i = 0; i < 5; i++)
{
cb = new CBook();
cb.BookName = string.Format("Name{0}", i + 1);
cb.Author = string.Format("Author{0}", i + 1);
alBook.Add(cb);
}
}

protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
TableCellCollection tcc = e.Row.Cells;
if (e.Row.RowIndex == 0)
{
tcc[2].RowSpan = 5;
tcc[2].Text = "跨欄資料";
}
else
{
tcc.Clear();
tcc.Add(new TableCell());
tcc[0].Text = Convert.ToString(DataBinder.Eval(e.Row.DataItem,"BookName"));
tcc.Add(new TableCell());
tcc[1].Text = Convert.ToString(DataBinder.Eval(e.Row.DataItem, "Author"));
}


}
}

2008年11月6日 星期四

User Control

User Control 與 Server Control 提供了程式的可重複使用性,但是兩者的開發成本上,卻是有著蠻大的差距。使用 UserControl 可以讓程式設計師保有拖拉物件的習慣與WYSIWYG(所見即所得)的便利性,入門上的門檻其實是比較低的。然而 Server Control的開發,則必須對 .Net 事件的觸發及基本類別的幾個重要屬性或方法有一定了解,才會比較能夠用起來得心順手。Server Control的確在跨專案也可使用的特性下獨具優勢,不然你看外面 third-party 所賣的元件,絕大多數都是包成 dll 讓你直接呼叫就可使用,很少是提供 User Control 來給你 copy-past 使用的。但並非少了跨專案可直接使用的特性,就會讓 User Control 失去舞台,相反地,只要你掌握住幾個 User Control 的關鍵要點, 相信使用起來就會非常的方便。

目前常會採用 User Control 的情況如下:
1.整個專案中重複出現的功能,如每頁上方的功能列
2.很多地方會重複出現的區塊

而自己遇到這種情況時,都會優先考慮採用 User Control 來達成。

回到剛剛所提到,要掌握住哪些 User Control 的要點呢?

要點一、ASPX 呼叫或設定 User Control 裡面的方法或屬性
自訂的User Control 裡,可能會定義了一些公開的方法或屬性,希望日後被某個 ASPX 頁面引用時,可以在 ASPX 的頁面裡直接呼叫 User Control 裡所定義的這些方法或屬性。

參考: http://paladinprogram.blogspot.com/2008/04/user-control.html

要點二、ASPX 攔截 User Control 裡的物件觸發事件
自訂的User Control 裡,我們可能加入了一些按鈕。而當這個 User Control 被某個 ASPX 頁面引用時,當網路使用者壓下自訂 User Control 按鈕時,希望也能夠讓 ASPX 頁面攔到是這個按鈕所觸發的事件,並在這事件裡頭寫些程式。
參考:http://paladinprogram.blogspot.com/2008/11/raise-usercontrol-event-to-main-page.html

相信這幾點釐清後, User Control 與你的距離,會拉近不少。

2008年11月5日 星期三

Blog 文章中貼程式碼

在網路上找了好久,
終於找到一篇看的懂,而且也可以有效的文章了。

我的目的,是希望自己在部落格所貼的程式碼能夠正確顯示出來。
不需要老是為了排版而傷腦經,現在,終於有個替代方案囉。


http://grandsights.twbbs.org/2007/04/blogger.html

在網頁範本裡加上下面這一段:


CODE, .code {
display: block; /* fixes a strange ie margin bug */
font-family: Courier New;
font-size: 8pt;
overflow:auto;
background: #f0f0f0 url(http://polin2005.googlepages.com/BG_CODE.gif) left top repeat-y;
border: 1px solid #ccc;
padding: 10px 10px 10px 21px;max-height:200px;
line-height: 1.2em;
}
CMD, .cmd {display: block; /* fixes a strange ie margin bug */
font-family: Courier New;
font-size: 8pt;
overflow:auto;
color: #ccc;background: #000 url(http://polin2005.googlepages.com/BG_CMD.gif) left top repeat-y;
border: 1px solid #ccc;
padding: 10px 10px 10px 21px;
max-height:200px;
line-height: 1.2em;
}

使用方式:

<pre class="code" > XXXX </pre >


除此之外,我還看到可以顯示顏色的ㄟ,
不知道有沒有好心人也可以教一下。
要如何弄出有顏色的程式碼。

如何將ArrayList 的資料繫結到 GridView

有時候,我要的其實不多。


如果有一個簡單的ArrayList,想直接當成 GridView資料來源,要如何
實作呢?


ArrayList 可以允許我們塞入物件類別,所以我需要事先定義一個類別,
裡頭必須包含公開的屬性,方便日後 GridView裡頭的欄位需要指定繫結
欄位來源時有所依據。


範例如下:


首先,先建立一個自定的類別。

public class cDateCombine
{
string _Date = string.Empty;
public string Date
{
get { return _Date; }
set { _Date = value; }
}

public cDateCombine(string strDate)
{
_Date = strDate;
}
}



在這個類別裡,我只定義了一個公開屬性 Date,
並且寫了一個可以自動將字串帶入的建構程序。


接著,在程式裡加上設定 GridView 資料來源的程式碼。


string strDate = "20080101,20090101,20090505";
string [] arrayDate = strDate.Split(',');

ArrayList alDate = new ArrayList();
for (int i = 0; i < arrayDate.Length; i++)
{
if (arrayDate[i].ToString().Length > 0)
alDate.Add(new cDateCombine(arrayDate[i]));
}

gv.DataSource = alDate;
gv.DataBind();

最後附上 Aspx 的頁面控制程式

<asp:GridView ID="gv" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:BoundField HeaderText="日期" DataField="Date" />
</Columns>
</asp:GridView>





另外,有篇寫的蠻完整的文章,可以參考。


參考文章
http://www.akadia.com/services/dotnet_arraylist_datagrid.html

將字串陣列進行排序

剛好有需要將字串陣列進行排序的功能,
也順便將不錯的 Code 記錄下來。

在 .Net 2.0 有提供一個 Array.Sort(  ) 方法,
很容易完成排序功能。

範例:

        string strTest = "C,S,A,B";
        string[] testArray = strTest.Split(',');
        Array.Sort(testArray);

2008年11月4日 星期二

透過 JavaScript 去抓 select 的值

常常會用到透過 JS 去抓 select 控制項裡目前被挑選的項目,
剛好有一篇 BLOG 介紹的蠻詳細的。

可以參考參考。



Raise UserControl event to Main Page


[詳細連結←跨加啦]

當寫好一個 User Control 後,接著就會放到一個 aspx 頁面讓他有表現的機會。
可是,如果我們自訂的 UserControl 裡有Button 控制項,也希望在 aspx 頁面
能夠可以攔到使用者壓下 UserControl 裡的 Button 被觸發的事件時,該怎麼做ㄋ?

以下介紹三種方法:

第一種,正規作法:

參考了 Chirag Darji 部落格文章。
他在介紹 delegate 時,順便也把我的問題給解決了。真是舉手之勞啊!


第二種,特殊作法:
參考了 Mr. Puma Chih Cheng Kuo 部落格文章。
他同樣也是使用 delegate 來解決,但是他提到了自定事件參數的概念。以往我們在事件
參數傳遞,預設都是使用 EventArgs e
若想要自定事件參數時,則要事先去定義自己的EventArgs,Puma 則自己定義了 MyEventArgs。


第三種,懶人作法:
參考了 Thea 部落格文章。
真是酷斃了!如果你只是單純的想要在aspx頁面攔到 UserControl 裡的事件,用這個就對了。


心得,不管你用哪一種方法,在 aspx 頁面一定要去將 UserControl 裡的事件加入你的 EventHandler。
而且有個地方要注意,你不能將註冊 EventHandler 的程式寫在 !IsPostBack ,因為在每一次頁面
PostBack 時,都必須重新註冊一次。