關于DataGrid Web控件的熱門問題__連載之四
2024-07-21 02:22:58
供稿:網友
動態顯示和隱藏列&動態增加列
——動態顯示隱藏列
動態顯示列的一種方式就是在設計時創建它們,然后在需要時隱藏或顯示它們,可以通過設定列的visible屬性來實現。下面的例子說明了如何控制datagrid的第二列(索引為一的列)的可見性。
datagrid1.column[1].visible=!(datagrid1.column[1].visible);
——動態增加列(這里列都是由數據庫讀出的列)
如果你事先知道需要哪些列,你可以隱藏或顯示它們,但是,有時你不到運行時是不知道需要哪些列的,在這種情況下,你可以動態創建列,并將其加入datagrid中。
實現的方法是創建一個datagrid支持的列類型的一個實例——綁定列、按鈕列、或者超鏈接列(還可以添加模板列,但是稍微復雜些)。
下例說明如何綁定兩個列到 datagrid中:
private void button1_click(object sender, system.eventargs e)
{
datagrid1.autogeneratecolumns = false;
datagrid1.datasource = this.dsbooks1;
datagrid1.datamember = "books";
datagrid1.datakeyfield = "bookid";
// add two columns
boundcolumn dgc_id = new boundcolumn();
dgc_id.datafield = "bookid";
dgc_id.headertext = "id";
dgc_id.itemstyle.width = new unit(80);
datagrid1.columns.add(dgc_id);
boundcolumn dgc_title= new boundcolumn();
dgc_title.datafield = "title";
dgc_title.headertext = "title";
datagrid1.columns.add(dgc_title);
this.sqldataadapter1.fill(this.dsbooks1);
datagrid1.databind();
}
任何時候向列中動態增加控件,都會遇到如何保持的問題。動態增加的列并非自動地添加到page的視圖態,因此,你需要添加page的邏輯,使得在每次提交—回傳的過程中,列是可見的。
實現上述問題的一個優秀的方法就是重載page的loadviewstate方法,它為我們提供了重新確定datagrid控件中列的較早機會,因為該方法的調用是在page_load事件觸發之前。在loadviewstate中重新添加列保證了它們在任何事件代碼執行前,對正常的操作是可用的。
下例展示了如何擴展上例使得每次page執行時都將列重新保存。和上例一樣,button1_click事件向datagrid中添加了兩列(該例中,事件句柄調用了一個獨立的方法——addcolumns()來實現),而且,page還包含了一個簡單的布爾屬性,稱為dynamiccolumnsadded來指示datagrid中是否有列動態增加。該屬性在視圖態下保存它的值。loadviewstate方法首先調用它的基類的loadviewstate方法,它摘錄視圖態信息并配置控件。如果列事先被添加到datagrid中,該方法就再次添加它們。
private bool dynamiccolumnadded{
get
{
object b = viewstate["dynamiccolumnadded"];
return (b == null) ? false : true;
}
set
{
viewstate["dynamiccolumnadded"] = value;
}
}
protected override void loadviewstate(object savedstate)
{
base.loadviewstate(savedstate);
if (dynamiccolumnadded)
{
this.addcolumns();
}
}
private void button1_click(object sender, system.eventargs e)
{
if(this.dynamiccolumnadded != true)
{
this.addcolumns();
}
}
private void addcolumns()
{
boundcolumn dgc_id = new boundcolumn();
dgc_id.datafield = "bookid";
dgc_id.headertext = "id";
dgc_id.itemstyle.width = new unit(80);
datagrid1.columns.add(dgc_id);
boundcolumn dgc_title= new boundcolumn();
dgc_title.datafield = "title";
dgc_title.headertext = "title";
datagrid1.columns.add(dgc_title);
this.sqldataadapter1.fill(this.dsbooks1);
datagrid1.databind();
this.dynamiccolumnadded = true;
}
(unfinished 所有代碼已經經過測試,只要獲得一個你自己的dataset即可)