一、 DataGridView控件的用法(如何綁定、修改其中某一列值、添加序號列、交換任意2列顯示順序)
1. DataGridView綁定數(shù)據(jù)源。
在頁面上拖放一個DataGridView控件
//連接數(shù)據(jù)庫讀取數(shù)據(jù),為DataGridView賦值。
String strConn = "server= .\XWPC_DATABASE;uid=數(shù)據(jù)庫用戶名;pwd=數(shù)據(jù)庫密碼;database=數(shù)據(jù)庫名";
SqlConnection conn = new SqlConnection(strConn);
String sqlId = "select * from [USER] ";
conn.Open();
SqlCommand cmd = new SqlCommand(sqlId, conn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds, "USER");
DataGridView.DataSource = ds;
DataGridView.DataMember = "USER";
conn.Close();
上述代碼執(zhí)行后頁面上數(shù)據(jù)顯示是這樣的:
2. 修改 DataGridView中數(shù)據(jù)的表頭(本來默認是數(shù)據(jù)庫中的字段名)。
//改變DataGridView的表頭
DataGridView.Columns[1].HeaderText = "用戶名";
//設(shè)置該列寬度
DataGridView.Columns[1].Width = 70;
3. 將DataGridView最前面一列編號改為從1開始依次增加的序號(默認的字段編號對用戶沒意義,而且不連續(xù))。
//在表前面加一列表示序號
DataGridView.Columns[0].HeaderText = "編號";
DataGridView.Columns[0].Width = 60;
//自動整理序列號
int coun =
DataGridView.RowCount;
for (int i = 0; i < coun - 1; i++){
DataGridView.Rows[i].Cells[0].Value = i + 1;
DataGridView.Rows[i].Cells["USER_ID"].Value = i + 1;
}
//改變DataGridView的表頭
DataGridView.Columns[1].HeaderText = "用戶名";
//設(shè)置該列寬度
DataGridView.Columns[1].Width = 70;
DataGridView.Columns[2].HeaderText = "密碼";
DataGridView.Columns[2].Width = 70;
//默認按順序每列DataGridView依次從ds中對應(yīng)賦值
DataGridView.Columns[0].DataPropertyName = ds.Tables[0].Columns[0].ToString();
執(zhí)行后效果如下:
4. 對調(diào) DataGridView中某兩列的順序,代碼如下:
//改變DataGridView的表頭
DataGridView.Columns[1].HeaderText = "密碼";
//設(shè)置該列寬度
DataGridView.Columns[1].Width = 70;
DataGridView.Columns[1].DataPropertyName = ds.Tables[0].Columns[2].ToString();
DataGridView.Columns[2].HeaderText = "用戶名";
DataGridView.Columns[2].Width = 70;
DataGridView.Columns[2].DataPropertyName = ds.Tables[0].Columns[1].ToString();
執(zhí)行效果:
5. 設(shè)置DataGridView使某列不顯示、使其不可直接編輯、使其不顯示最后一行空白。
|
//不顯示出dataGridView的最后一行空白 |
|
DataGridView.AllowUserToAddRows = false ; |
|
DataGridView.ReadOnly = true ; |
|
//數(shù)據(jù)庫表中第十列數(shù)據(jù)不顯示在表格中 |
|
DataGridView.Columns[9].Visible = false ; |
6. 將從 下拉列表ComboBox中選擇存入數(shù)據(jù)庫中的數(shù)據(jù)1,2…轉(zhuǎn)換為對應(yīng)字符串顯示給用戶(比如用戶角色在數(shù)據(jù)庫中1為管理員,2為會員,3為最終用 戶,那么DataGridView列表中應(yīng)該顯示管理員/會員/最終用戶而不是顯示1/2/3這樣的數(shù)字)。CheckBox也是同理(比如性別1為 男,0為女,我們需要顯示男/女而不是1/0)。
這個問題可以在數(shù)據(jù)從DataSet綁定到DataGridView之前對DataSet中數(shù)據(jù)進行遍歷一次,將該字段修改后再存入DataSet,然后再綁定到DataGridView,此法耗時,數(shù)據(jù)記錄多的情況延遲非常明顯。所以一般采用CellFormatting事件來完成該任務(wù),因為DataGridView.CellFormatting事件在每繪制一個單元格時,就會發(fā)生一次,這樣就可以在顯示列表時修改這個單元格的顯示內(nèi)容。當(dāng)然,也正因為每繪制一個單元格都觸發(fā)CellFormatting事件,
所以處理此事件時應(yīng)避免時間過長。另外,在檢索單元格FormattedValue或調(diào)用其GetFormattedValue方法時,此事件也會發(fā)生。 網(wǎng)上也有少數(shù)人說該事件不建議使用,因為這個事件稍不注意就經(jīng)常被觸發(fā)而更新表格,比如排序時候也被觸發(fā),目前我沒發(fā)現(xiàn)這個問題,也可能是我數(shù)據(jù)比較少 吧。實際上該事件被普遍用于幫助用戶實現(xiàn)自定義單元格樣式,比如改變背景顏色、高亮顯示某行等。廢話不說了,用CellFormatting事件實現(xiàn)修改DataGridView中某列的值代碼如下:(在設(shè)計器中DataGridView的屬性欄–切換到事件欄–找到CellFormatting事件,雙擊進入該事件函數(shù)體寫如下 代碼 。 )
方法一:
1 |
private void DataGridView_CellFormatting( object sender,
DataGridViewCellFormattingEventArgs e) { |
2 |
if (e == null || e.Value == null ||
!(sender is DataGridView)) |
5 |
DataGridView view = (DataGridView)sender; |
8 |
if (view.Columns[e.ColumnIndex].DataPropertyName == "USER_ROLEID" ) { |
9 |
int val = Convert.ToInt32(e.Value); |
23 |
e.FormattingApplied = true ; |
26 |
catch (System.Exception ex) { |
27 |
e.FormattingApplied = false ; |
28 |
MessageBox.Show(ex.ToString()); |
方法二:
1 |
private void DataGridView_CellFormatting( object sender,
DataGridViewCellFormattingEventArgs e) { |
3 |
//“USER_ROLEID”這列在數(shù)據(jù)庫中對應(yīng)第5列,角標是4 |
4 |
if (e.ColumnIndex == 4) { |
5 |
int val = Convert.ToInt32(e.Value); |
19 |
e.FormattingApplied = true ; |
22 |
catch (System.Exception ex) { |
23 |
e.FormattingApplied = false ; |
24 |
MessageBox.Show(ex.ToString()); |
以上兩種方法都測試通過,結(jié)果一樣,執(zhí)行后效果如下:
|