根據DataTable動態生成包含checkbox的GridView,其中DataTable中對應checkbox那一列的值必須為bool值。
public static GridView DynamicGenerateColumns(GridView gv, DataTable dt) { // 把GridView的自動產生列設置為false,否則會出現重復列 gv.AutoGenerateColumns = false; // 清空所有的Columns gv.Columns.Clear(); // 遍歷DataTable 的每個Columns,然后添加到GridView中去 foreach (DataColumn item in dt.Columns) { if (item.ColumnName == "選擇") { CheckBoxField chCol = new CheckBoxField(); chCol.HeaderText = item.ColumnName; chCol.DataField = item.ColumnName; chCol.Visible = true; gv.Columns.Add(chCol); continue; } BoundField col = new BoundField(); col.HeaderText = item.ColumnName; col.DataField = item.ColumnName; col.Visible = true; gv.Columns.Add(col); } return gv; }
然后在返回的GridView上綁定dataTable就可以了。還可以添加checkBox點擊事件javascript處理函數。
gridView.DataSource = dataTable; gridView.DataBind(); for (int i = 0; i < ChargingGridView.Rows.Count; i++) { ((System.Web.UI.WebControls.CheckBox)(gridView.Rows[i].Cells[0].Controls[0])).Attributes.Add("onclick", "OnClickCheck()"); }
在JS函數中對GridView中checkbox的處理,注意下面的Javascript代碼是如何獲取checkbox及其它普通元素的的值。
//該函數實現了根據選擇的checkbox計算某列的值總和的功能 function OnClickCheck() { var sumValue=0; var gv = document.getElementById("<%=gridView.ClientID%>"); for (var i = 1; i < gv.rows.length; i++) { if (gv.rows[i].cells[0].children[0].checked == false) { continue; } sumValue = sumValue + parseFloat(gv.rows[i].cells[5].innerText); } document.getElementById('<%=TotalLabel.ClientID%>').innerHTML = sumValue; }
上面的代碼在后端用C#實現如下,
private void OnClickCheck() { double totalAmount = 0; for (int i = 0; i < gridView.Rows.Count; i++) { if (false == ((System.Web.UI.WebControls.CheckBox)(ChargingGridView.Rows[i].Cells[0].Controls[0])).Checked) { continue; } totalAmount += Convert.ToDouble(gridView.Rows[i].Cells[6].Text.Trim()); } TotalLabel.Text = totalAmount.ToString(); }
SQL SERVER中bool的字段類型為bit,如果bool值是從DataTable取出的,則不用修改,如果該列bool值是在select返回的結果上添加的一列固定值,那么就需要在返回的DataTable前添加一列:
dataTable.Columns.Add("選擇", typeof(bool)); dataTable.Columns["選擇"].SetOrdinal(0); foreach (DataRow dr in ChargeItemDataTable.Rows) { dr["選擇"] = true;//初始化checkbox為選中 }
關於在select返回的結果添加一列固定值,如果添加這一列是字符串或數值類型,那么直接在select語句中即可設置,如select '吳宗憲' as hostName,age from showhosts。但如果是bool值的話,就不能select true as 選擇……,這樣SQL會報錯,要照上面的方法來添加。
現在還有個問題,就是生成的GridView中的checkbox是灰色的,不能操作,也就是enable為false。現在需要綁定GridView_RowDataBound函數,在該函數中設置checkBox的enabled為true。添加該函數過程為:在aspx頁面設計頁中,選中GridView,右邊屬性欄中選擇事件,在下面找到RowDataBound,生成事件處理函數。
protected void gridView_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.Cells[0].GetType() == typeof(System.Web.UI.WebControls.DataControlFieldCell)) { TableCell tc = e.Row.Cells[0]; if (tc.Controls.Count > 0) { System.Web.UI.WebControls.CheckBox cb = (System.Web.UI.WebControls.CheckBox)tc.Controls[0]; if (!(cb == null)) { cb.Enabled = true; } } } }
有時候需要把GridView轉換成DataTable:
public static DataTable GetDataTableFromGridView(GridView gv, DataTable dt) { GridViewRow headerRow = gv.HeaderRow; int columnCount = headerRow.Cells.Count; for (int i = 0; i < columnCount; i++) { DataColumn dc = dt.Columns.Add(); dc.ColumnName = headerRow.Cells[i].Text.Trim(); if ("選擇" == headerRow.Cells[i].Text.Trim()) { dc.DataType = typeof(bool); } else { dc.DataType = typeof(string); } } for (int i = 0; i < gv.Rows.Count; i++) { DataRow dr = dt.NewRow(); for (int j = 0; j < gv.Columns.Count; j++) { if ("選擇" == headerRow.Cells[j].Text.Trim()) { if (true == ((System.Web.UI.WebControls.CheckBox)(gv.Rows[i].Cells[j].Controls[0])).Checked) { dr[j] = true; } else { dr[j] = false; } } else if (gv.Rows[i].Cells[j].Text.Trim() == " ") { dr[j] = ""; } else { dr[j] = gv.Rows[i].Cells[j].Text.Trim(); } } dt.Rows.Add(dr); } return dt; }
