一、屬性應用
1.設置單元格鼠標點擊后就進入編輯狀態
設置DataGridView控件的EditMode這個屬性,即
EditMode = System.Windows.Forms.DataGridViewEditMode.EditOnEnter
這樣當鼠標點擊單元格時就會變成編輯狀態。
2.設置DataGridView控件的行選擇樣式
設置DataGridView控件的SelectionMode這個屬性,即
SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect
這樣我們再選中的時候就是以行的形式選中的。
3.當用戶點擊列標題時不進行排序
在默認情況下,當用戶點擊DataGridView控件的列標題時會自動對內容進行排序,現在我們禁止它進行排序,通過設置每一列的SortMode這個屬性來實現,即
SortMode=NotSortable
這樣當我們點擊列標題時就不會自動進行排序了。
4.去除DataGridView自帶的一行(帶有*號的那一行,或者是不允許用戶添加數據)
DataGridView控件在默認的情況下會自動的綁上一行空數據,這一行空數據可以使用戶進行數據添加,現在我們想去除這一列,通過設置屬性
AllowUserToAddRows=false;
這樣在綁定的時候就不會再顯示這一行了。
5.設置單元格不可編輯
方法一:我們可以在控件完成數據綁定后在對DataGridView控件進行遍歷,根據條件設置單元格的readonly屬性,使此單元格不能進行編輯。如下:
/// <summary> /// 更新數據 /// </summary> public void UpdateData() { //獲取數據源 dgvliucycx.DataSource = bll_liucy.GetAllList().Tables[0].DefaultView; //改變廢棄項的背景顏色 ChangeColor(); //設置修改時間和修改人列為只讀的 BandColumn(); } /// <summary> /// 改變DataGridView控件廢棄項的背景顏色 /// </summary> public void ChangeColor() { //將已廢棄的樣品記錄背景色表示為藍色 try { for (int i = 0; i < dgvliucycx.Rows.Count; i++) { if (Convert.ToString(dgvliucycx.Rows[i].Cells["BIAOS"].Value) == "廢棄") { dgvliucycx.Rows[i].DefaultCellStyle.BackColor = Color.Aqua; } } } catch (Exception ex) { KryptonMessageBox.Show(ex.ToString()); } }
/// <summary> /// 綁定修改人和修改時間這一列,進攻參考 /// </summary> public void BandColumn() { foreach (DataGridViewRow item in this.dgvliucycx.Rows) { //設定修改人和修改日期、標識為只讀的 item.Cells["XIUGR"].ReadOnly = true; item.Cells["XIUGRQ"].ReadOnly = true; item.Cells["BIAOS"].ReadOnly = true; } } |
方法二:我們還可以在CellBeginEdit事件中進行判斷是否對單元格進行編輯,如下:
// CellBeginEdit 事件處理方法 private void DataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) { DataGridView dgv = (DataGridView)sender; //是否可以進行編輯的條件檢查 if (dgv.Columns[e.ColumnIndex].Name == "Column1" && !(bool)dgv["Column2", e.RowIndex].Value) { // 取消編輯 e.Cancel = true; } } |
6.DataGridView判斷新增行
DataGridView的AllowUserToAddRows屬性為True時也就是允許用戶追加新行的場合下, DataGridView的最后一行就是新追加的
行(*行)。使用 DataGridViewRow.IsNewRow 屬性可以判斷哪一行是新追加的行。另外,通過DataGridView.NewRowIndex 可以
獲取新行的行序列號。在沒有新行的時候,NewRowIndex = -1。
7.DataGridView行刪除操作的自定義
1) 無條件的限制行刪除操作。
默認時,DataGridView 是允許用戶進行行的刪除操作的。如果設置 DataGridView對象的AllowUserToDeleteRows屬性為 False 時, 用戶的行刪除操作就被禁止了。
但是,通過 DataGridViewRowCollection.Remove 還是可以進行行的刪除。
補足: 如果 DataGridView 綁定的是 DataView 的話,通過 DataView.AllowDelete 也可以控制行的刪除。
2) 行刪除時的條件判斷處理。
用戶在刪除行的時候,將會引發 DataGridView.UserDeletingRow 事件。 在這個事件里,可以判斷條件並取消刪除操作。
// DataGridView1 的 UserDeletingRow 事件
private void DataGridView1_UserDeletingRow(
object sender, DataGridViewRowCancelEventArgs e)
{
// 刪除前的用戶確認。
if (MessageBox.Show("確認要刪除該行數據嗎?", "刪除確認",
MessageBoxButtons.OKCancel,
MessageBoxIcon.Question) != DialogResult.OK)
{
// 如果不是 OK,則取消。
e.Cancel = true;
}
}
8.DataGridView行頭和列頭的隱藏
// 列頭隱藏
DataGridView1.ColumnHeadersVisible = false;
// 行頭隱藏
DataGridView1.RowHeadersVisible = false;
10.DataGridView行和列的刪除
' 刪除名為"Column1"的列
DataGridView1.Columns.Remove("Column1");
' 刪除第一列
DataGridView1.Columns.RemoveAt(0);
' 刪除第一行
DataGridView1.Rows.RemoveAt(0);
11.設置行或列為只讀的
上面已經寫過設置單元格只讀,現在說一下行或列為只讀的。
1)設置列只讀
可以通過設計器直接在設計器中設置DataGridView中的某一列為只讀,即用戶在點擊控件時不能使控件進入編輯狀態,我們只需設置列屬性Readonly=true即可,如下:
這樣當給DataGridView控件綁定數據后,ID這一列就是不可編輯的。
2)設置行只讀
設置行只讀,在這里是通過編程的方式實現,在我們綁定完數據源后,在對DataGridView控件里面的數據行設置為只讀,這時我們也可以根據我們自己程序的需要,設置要對哪些行設置只讀,如下:
/// <summary> /// 設置行只讀 /// </summary> public void SetReadonlyRow() { //遍歷DataGridView控件中所有的行,並將其設為只讀,用戶不可編輯 foreach (DataGridViewRow item in this.dgvFenxzgl.Rows) { //將行設置為只讀,在這里我們可以寫自己的條件控制哪些行需要只讀 item.ReadOnly = true; } } |
12.使窗體在屏幕中間顯示
設置窗體的StartPosition屬性,如下:
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;//this表示的是窗體對象
13.設置窗體不可改變大小
設置窗體不可改變大小即設置窗體的最大大小和最小大小相同即可,即設置窗體的MaximumSize屬性和MinimumSize屬性相等,如下:
this.MaximumSize = new System.Drawing.Size(960, 620);//this表示的是窗體對象
this.MinimumSize = new System.Drawing.Size(960, 620);
14.不顯示DataGridView下面的新行
在綁定數據后,DataGridView控件下面會默認添加一條新行(前面行頭以*號打頭的),這樣的目的是為了使用戶能在這里添加數據,有時為了美觀,希望在綁定的時候不顯示該行,而是通過按鈕的形式進行添加,實現方法,我們只需設置DataGridView控件的AllowUserToAddRows屬性,如下:
this.dgvFenxzgl.AllowUserToAddRows = false;
15.設置DataGridView控件中單元格的選中樣式
默認情況下我們點擊DataGridView控件時只是被單擊的單元格選中狀態,有時我們希望點擊某個單元格將這一行數據全部選中或是某一列全部選中,這時就設置DataGridView控件的SelectionMode這個屬性,如下:
//以單元格的形式選中 this.dgvFenxzgl.SelectionMode = DataGridViewSelectionMode.CellSelect;
//選中當前單元格的列頭,如果DataGridView中某列設置了SortMode屬性為Automatic,則不能將SelectionMode屬性設置為ColumnHeaderSelect this.dgvFenxzgl.SelectionMode = DataGridViewSelectionMode.ColumnHeaderSelect;
//通過單擊列的標頭或該列所包含的單元格選定整個列。如果DataGridView中某列設置了SortMode屬性為Automatic,則不能將SelectionMode屬性設置為ColumnHeaderSelect this.dgvFenxzgl.SelectionMode = DataGridViewSelectionMode.FullColumnSelect;
//通過單擊行的標頭或是該行所包含的單元格選定整個行。 this.dgvFenxzgl.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
//通過單擊行的標頭單元格選定此行。通過單擊某個單元格可以單獨選定此單元格。 this.dgvFenxzgl.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect; |
16.設置DataGridView控件中是否可以進行多選
在默認情況下,當我們按住Ctrl鍵時選中DataGridView中的數據行就可以進行多選,相關設置如下:
this.dgvFenxzgl.MultiSelect = true;//當設置為true時表示可以對數據行進行多選
17.禁用點擊列標題進行排序
默認情況下,當我們點擊DataGridView控件的列標題時會導致控件里面的數據進行重新排序,我們可以通過設置每一個列的SortMode屬性來控制它的排序方式,如下:
//無排序,即點擊列標題時不會導致數據重新排序 this.dgvFenxzgl.Columns["MEIKMC"].SortMode = DataGridViewColumnSortMode.NotSortable;
//點擊列標題時會導致數據進行重排序 this.dgvFenxzgl.Columns["MEIKMC"].SortMode = DataGridViewColumnSortMode.Automatic;
//此列僅能以編程方式進行排序,並且列標頭將包含排序標志符號的空間。 this.dgvFenxzgl.Columns["MEIKMC"].SortMode = DataGridViewColumnSortMode.Programmatic; |
18.DataGridView凍結列和行
凍結DataGridView的列和行,通過設置屬性Frozen來進行控制。
1)凍結列
凍結列我們可以再設置器中進行設置,如下:
2)凍結行
凍結行的時候我們就需通過編程的方式實現,方法如下:
/// <summary> /// 凍結行或列 /// </summary> public void FrozenRowOrColumn() { //凍結行 foreach (DataGridViewRow item in this.dgvFenxzgl.Rows) { item.Frozen = true; }
//凍結列 foreach (DataGridViewColumn item in this.dgvFenxzgl.Columns) { item.Frozen = true; } } |
二、事件應用
1.怎么樣通過按鈕事件給DataGridView控件添加一行空數據
我們希望我們通過按鈕事件給DataGridView控件添加一行空數據,當我們點擊按鈕時,在Click事件中填寫代碼,如下:
DataRow newrow = ((DataView)(this.dgvliucycx.DataSource)).Table.DataSet.Tables[0].Rows.Add();
//設置默認值
newrow["DENGJRQ"] = DateTime.Now.ToLongDateString();
newrow["YOUXRQ"] = DateTime.Now.ToLongDateString();
newrow["BIAOS"] = "存儲";
通過返回創建的新行對象,我們還可以為新添加的行設置默認值。
2.判斷鼠標點中的行是否可以進行編輯
當用戶點擊某單元格想要修改它的數據的時候,需要做一個判斷看看用戶是否可以進行修改,解決辦法是:當用戶點中某一行時,會觸發DataGridView控件CellBeginEdit事件,在這個事件里面我們可以根據用戶點擊的該行的數據來判斷用戶是否可以更改該行的數據。如下:
上面顯示的是效果圖,需求是這樣的,當某條記錄的狀態時廢棄時用戶就不能在對其進行編輯,反之如果某條記錄的狀態是存儲時,用戶就可以對這條記錄進行修改。實現:
//開始編輯單元格之前的判斷
private void dgvliucycx_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
if (this.dgvliucycx.Rows[e.RowIndex].Cells["BIAOS"].Value.ToString().Equals("廢棄"))
{
//取消對此單元格的編輯
e.Cancel = true;
return;
}
}
3.用戶點擊某單元格進行編輯時,觸發事件的順序及使用
首先觸發的是CellBeginEdit事件----其次是CellParsing事件----再是CellEndEdit事件
CellBeginEdit事件:在觸發該事件時單元格還沒有獲得焦點,我們可以通過設置事件參數e來決定是否執行對單元格的編輯,如下:
private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
//執行編輯,這個一般不用寫
e.Cancel = true;
//不執行編輯,這個一般是通過條件判斷是否執行編輯,如果條件不成立,即不允許對單元格進行編輯
e.Cancel = false;
}
CellParsing事件:在該事件中我們可以對輸入的文本進行格式化,如將輸入的英文字母全部改成大寫等等,如下;
private void dataGridView1_CellParsing(object sender, DataGridViewCellParsingEventArgs e)
{
/*
* 這里必須是通過e.Value來獲得重新輸入的值
* 如果是通過this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString()這種方法獲得
* 那么獲得值將是原來的值,並不是用戶剛剛輸入的值
* 這個也正可以對用戶輸入的數據進行驗證,如果不符合則將原來的值再賦給該單元格,不進行修改
* 切記!!!!!
* 在這里必須將e.ParsingApplied屬性設置為true,否則剛剛用戶輸入的值不會更新
* 還是會將原來的值賦給該單元格
* */
e.Value = e.Value.ToString().ToUpper();
e.ParsingApplied = true;
//MessageBox.Show(this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());
}
CellEndEdit事件:觸發該事件的時候,單元格已經失去焦點,可以獲得更新后的值,如下:
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
//MessageBox.Show("CellEndEdit");
if (this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString().Contains("我"))
{
MessageBox.Show("有我" + "..." + this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());
}
}
4.給新增行設置默認數據
前面已經講過怎么通過按鈕事件給DataGridView添加一個新行,現在我們給添加的新行設置默認值,如下:
private void button1_Click(object sender, EventArgs e)
{
DataRow newrow = ((DataView)(this.dataGridView1.DataSource)).Table.DataSet.Tables[0].Rows.Add();
newrow["StuID"] = "admin";
newrow["Name"] = "admin";
}
5.當我們點擊DataGridView控件的列標題時觸發的事件解釋
會觸發控件的ColumnHeaderMouseClick事件和ColumnHeaderMouseClick事件,在這里我們可以控制綁定數據的變化,如:
我們可以設置用戶不在對綁定的數據進行編輯。
//當用戶點擊列標題時觸發的事件 private void dgvFenxzgl_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) { //設置列不可編輯 SetReadonlyRow(); }
/// <summary> /// 設置行只讀 /// </summary> public void SetReadonlyRow() { foreach (DataGridViewRow item in this.dgvFenxzgl.Rows) { item.ReadOnly = true; } } |
6.在DataGridView控件中編輯數據時檢測輸入數據的格式是否正確
在默認情況下,當我們對DataGridView控件里面的數據進行編輯時,如果我們輸入的數據格式與綁定的數據源的格式不正確,就會引發異常,並觸發DataGridView控件的DataError事件,在這個事件中通過事件參數e我們可以獲得剛剛數據的數據,並且可以獲得異常信息,同時我們也可以通過e.Cancel這個屬性來決定是否取消事件的值。如下:
當我們在結果值這一欄中輸入漢字時,就會引發異常,此時通過在DataError事件中我們就可以獲取到該異常,將異常信息彈出,提示用戶。方法如下:
//當輸入的數據引發異常時執行的事件
private void dgvFenxzgl_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
KryptonMessageBox.Show(e.Exception.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
e.Cancel = true;
}
7.將新插入的行插入到DataGridView中的第一行的方法
這里我采用的是將數據源取出再放回的方法,如下:
//添加事件 private void btntj_Click(object sender, EventArgs e) { try { DataTable dt = ((DataView)dgvFenxzgl.DataSource).Table.DataSet.Tables[0]; DataRow dr = dt.NewRow(); dr["ZHI"] = "0"; dt.Rows.InsertAt(dr, 0); this.dgvFenxzgl.DataSource = dt.DefaultView; } catch (Exception ex) { MessageBox.Show(ex.Message); } } |
8.當用戶點擊Del(刪除鍵)刪除某一行時引發的事件
一般情況下我們不希望用戶點擊del刪除鍵刪除記錄,這樣可以設置DataGridView控件的AllowUserToDeleteRows屬性控制用戶是否可以刪除行,如下:
//不允許用戶點擊鍵盤上的Del鍵刪除數據 this.dgvFenxzgl.AllowUserToDeleteRows = false; //允許用戶點擊鍵盤上的Del鍵刪除數據 this.dgvFenxzgl.AllowUserToDeleteRows = true; |
當用戶點擊鍵盤上的Del鍵刪除數據時,會觸發控件的UserDeletingRow事件,在事件里面我們進行我們的判斷,如下:
//當用戶點擊鍵盤上的Del鍵刪除數據時觸發的事件 private void dgvFenxzgl_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e) { if (MessageBox.Show("您確定要刪除該行嗎?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK) { //確定要刪除執行的操作 //在這里我們也可以通過e.Row這個屬性獲得要刪除行的數據 //判斷是否應該刪除該行,還是用戶操作失誤 } else { //取消刪除操作 e.Cancel = false; } } |
當行刪除后會觸發UserDeletedRow事件,如下:
//當刪除結束時觸發該事件 private void dgvFenxzgl_UserDeletedRow(object sender, DataGridViewRowEventArgs e) { MessageBox.Show("刪除結束", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); } |
三、技巧應用
1.判斷綁定到DataGridView中的數據是否被修改了
這里面綁定到DataGridView中數據源必須是DataTable或DataView,對於其他的數據源本方法未測試,在判斷是否發生了改變的時候,我們需要將數據源取出,並強制轉化為DataTable或DataView,如下:
//首先將綁定的數據源強制轉化為數據表DataTable DataTable dt = ((DataView)(this.dgvFenxzgl.DataSource)).Table.DataSet.Tables[0]; //獲得表中被修改的數據 DataTable dtModified = dt.GetChanges(DataRowState.Modified); if (dtModified.Rows.Count > 0)//如果行數大於0.表示已經有數據被修改了 { //在這里我們可以獲得被修改的數據 //獲得被修改的數據 foreach (DataRow item in dtModified.Rows) { //根據表結構獲得它每行每列的值 /* * item["MEIKMC"].ToString(); * ... */ } } |
2.如何判斷DataGridView中的新增行
這里綁定到DataGridView控件的數據源必須是DataTable或DataView,方法如下:
//首先將綁定的數據源強制轉化為數據表DataTable DataTable dt = ((DataView)(this.dgvFenxzgl.DataSource)).Table.DataSet.Tables[0]; //獲得表中新增的行數據 DataTable dtAdd = dt.GetChanges(DataRowState.Added); if (dtAdd.Rows.Count > 0)//如果行數大於0,表示已經有新行加入 { //在這里我們就可以獲取新增行的數據 //獲取新增行數據的方法 foreach (DataRow item in dtAdd.Rows) { //根據表結構獲得它每行每列的值 /* * item["MEIKMC"].ToString(); * ... */ } } |
3.設置DataGridView控件的各行變色
在綁定完數據后,進行如下操作,方法如下:
/// <summary> /// 設置各行變色 /// </summary> public void SetRowBgColor() { foreach (DataGridViewRow item in this.dgvFenxzgl.Rows) { if (item.Index % 2 == 0) { item.DefaultCellStyle.BackColor = Color.Aqua; } else { item.DefaultCellStyle.BackColor = Color.DarkGray; } } } |
4.設置選中行的背景色
在綁定完數據源完,執行下面的操作,方法如下:
/// <summary> /// 設置選中行的背景色 /// </summary> public void SetSelectedRowBgColor() { foreach (DataGridViewRow item in this.dgvFenxzgl.Rows) { //設置選中行的背景色 item.DefaultCellStyle.SelectionBackColor = Color.DarkRed; //設置選中行的前景色 item.DefaultCellStyle.SelectionForeColor = Color.DarkSeaGreen; } } |