動態列 ExtAspNet.BoundField 只能在Page_Init和Page_Load等方法中增加,而在有些地方,比如點擊按鈕後動態增加,就無法生效。
有個情境:查詢時,使用者選擇需要的欄位來顯示,就涉及到動態列。
方法一:規避解決,查詢結果直接彈出個頁面,沒有問題。
方法二:
(1) 在Page_Load方法中增加若干個隱藏列
for (int i = 0; i < QUERY_GRIDVIEW_COLUMN_COUNT; i++) { ExtAspNet.BoundField boundField = new ExtAspNet.BoundField(); boundField.HeaderText = string.Format("第{0}列", i + 1); boundField.Hidden = true; gridQueryResult.Columns.Add(boundField); }
(2) 在查詢過程中設定繫結資料行對於的欄位
/* 獲得查詢結果 */
DataSet ds = ....
foreach (DataColumn dataColumn in ds.Tables[0].Columns) { if (dataKeyNames.Contains(dataColumn.ColumnName)) { continue; } ExtAspNet.BoundField boundField = (ExtAspNet.BoundField)gridQueryResult.Columns[index]; if (!dataKeyNames.Contains(dataColumn.ColumnName)) { boundField.Hidden = false; } boundField.DataTooltipField = dataColumn.ColumnName; boundField.DataField = dataColumn.ColumnName; //boundField.HeaderText = dataColumn.Caption; index++;}
注意,這裡直接設定繫結資料行 HeaderText 無法生效。
(3)在查詢後重新設定標題列
/// <summary> /// 查詢 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnQuery_Click(object sender, EventArgs e) { gridQueryResult.PageIndex = 0; LoadData(); if (DataFieldTable != null) { StringBuilder sb = new StringBuilder(); sb.AppendFormat(@"var grid = Ext.getCmp('{0}'); var columnModel = grid.getColumnModel();", gridQueryResult.ClientID); for (int i = 0; i < DataFieldTable.Rows.Count; i++) { sb.AppendFormat("columnModel.setColumnHeader({0}, '{1}');", i + 1, DataFieldTable.Rows[i]["Alias"]); } ExtAspNet.PageContext.RegisterStartupScript(sb.ToString()); } }
這裡用了一個datatable來儲存使用者選擇的欄位設定條件等屬性,你可以換成你儲存使用者選擇欄位列表。
OK.