動態顯示和隱藏列&動態增加列 ——動態顯示隱藏列 動態顯示列的一種方式就是在設計時創建它們,然後在需要時隱藏或顯示它們,可以通過設定列的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即可)
|
|