關於DataGrid Web控制項的熱門問題
來源:互聯網
上載者:User
datagrid|web|控制項|問題 動態顯示和隱藏列&動態增加列
——動態顯示隱藏列
動態顯示列的一種方式就是在設計時建立它們,然後在需要時隱藏或顯示它們,可以通過設定列的Visible屬性來實現。下面的例子說明了如何控制DataGrid的第二列(索引為一的列)的可見度。
DataGrid1.Column[1].visible=!(DataGrid1.Column[1].visible);
——動態增加列(這裡列都是由資料庫讀出的列)
如果你事Crowdsourced Security Testing道需要哪些列,你可以隱藏或顯示它們,但是,有時你不到運行時是不知道需要哪些列的,在這種情況下,你可以動態建立列,並將其加入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即可)