還好,在 .Net 2.0 之後的 DataView 有強化了其功能,增加一個方法 DataView.ToTable ( ) ,可以讓你輕鬆的轉型為 DataTable。
2008年11月21日 星期五
DataView To DataTable
在 .Net 2.0 提供了 SqlDataSource 簡化了存取 SQL Sever 的操作。但對於回傳值的使用,常見的是 DataView 與 DataReader。但如果我們需要對所回傳資料進行資料的異動處理時,DataView真的就很不方便了。
2008年11月11日 星期二
showmodaldialog 檔案下載沒有反應
最近發現使用 showmodaldialog 時,雖然在 header 裡面有放 <base target="_self" /> 來處理 postback 的事件,但只要遇到有檔案下載的時候,不管怎麼點選都沒任何反應。可是改成 FireFox 就正常。另外,不使用 showmodaldialog 而是直接開啟那頁,又正常。
主要,是在原先下載的鏈結裡,設定 target ,並指向自定的一個空的 iframe 。這樣就可以正確的執行我想要的下載功能了。
在網路上剛好找到一位跟我同病相憐的人,他介紹了一個完美的解決方法。
而我也修改了自己的程式如下:
<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 達到跨欄效果的方法:
在 aspx 頁面,放置一個 GridView
定義自定的類別,以供 GridView 當資料來源
.cs 的程式
書名 | 作者 | 備註 |
---|---|---|
Name1 | Author1 | 跨欄資料 |
Name2 | Author2 | |
Name3 | Author3 | |
Name4 | Author4 | |
Name5 | Author5 |
在 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 與你的距離,會拉近不少。
目前常會採用 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
在網頁範本裡加上下面這一段:
使用方式:
除此之外,我還看到可以顯示顏色的ㄟ,
不知道有沒有好心人也可以教一下。
要如何弄出有顏色的程式碼。
終於找到一篇看的懂,而且也可以有效的文章了。
我的目的,是希望自己在部落格所貼的程式碼能夠正確顯示出來。
不需要老是為了排版而傷腦經,現在,終於有個替代方案囉。
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裡頭的欄位需要指定繫結
欄位來源時有所依據。
範例如下:
首先,先建立一個自定的類別。
在這個類別裡,我只定義了一個公開屬性 Date,
並且寫了一個可以自動將字串帶入的建構程序。
接著,在程式裡加上設定 GridView 資料來源的程式碼。
另外,有篇寫的蠻完整的文章,可以參考。
參考文章
http://www.akadia.com/services/dotnet_arraylist_datagrid.html
如果有一個簡單的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日 星期二
Raise UserControl event to Main Page
[詳細連結←跨加啦]
可是,如果我們自訂的 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 時,都必須重新註冊一次。
訂閱:
文章 (Atom)