C# winform DataGridView 操作大全
C# DataGridView控件動態添加新行
DataGridView控件在實際應用中非常實用,特別需要表格顯示數據時。可以靜態綁定數據源,這樣就自動為DataGridView控件添加相應的行。假如需要動態為DataGridView控件添加新行,方法有很多種,下面簡單介紹如何為DataGridView控件動態添加新行的兩種方法:
?
?
方法一:
int?index=this.dataGridView1.Rows.Add();
this.dataGridView1.Rows[index].Cells[0].Value =?"1";
this.dataGridView1.Rows[index].Cells[1].Value =?"2";
this.dataGridView1.Rows[index].Cells[2].Value =?"監聽";
?
利用dataGridView1.Rows.Add()事件為DataGridView控件增加新的行,該函數返回添加新行的索引號,即新行的行號,然后可以通過該索引號操作該行的各個單元格,如dataGridView1.Rows[index].Cells[0].Value =?"1"。這是很常用也是很簡單的方法。
?
?
方法二:
DataGridViewRow row?=?new?DataGridViewRow();
DataGridViewTextBoxCell textboxcell?=?new?DataGridViewTextBoxCell();
textboxcell.Value?=?"aaa";
row.Cells.Add(textboxcell);
DataGridViewComboBoxCell?comboxcell?=?new?DataGridViewComboBoxCell();
row.Cells.Add(comboxcell);
dataGridView1.Rows.Add(row);
?
?
方法二比方法一要復雜一些,但是在一些特殊場合非常實用,例如,要在新行中的某些單元格添加下拉框、按鈕之類的控件時,該方法很有幫助。
DataGridViewRow row?=?new?DataGridViewRow();是創建DataGridView的行對象,DataGridViewTextBoxCell是單元格的內容是個TextBox,DataGridViewComboBoxCell是單元格的內容是下拉列表框,同理可知,DataGridViewButtonCell是單元格的內容是個按鈕,等等。textboxcell是新創建的單元格的對象,可以為該對象添加其屬性。然后通過row.Cells.Add(textboxcell)為row對象添加textboxcell單元格。要添加其他的單元格,用同樣的方法即可。
最后通過dataGridView1.Rows.Add(row)為dataGridView1控件添加新的行row。
① DataGridView?取得或者修改當前單元格的內容:
當前單元格指的是 DataGridView 焦點所在的單元格,它可以通過 DataGridView 對象的 CurrentCell 屬性取得。如果當前單元格不存在的時候,返回Nothing(C#是null)
// 取得當前單元格內容?
Console.WriteLine(DataGridView1.CurrentCell.Value);
// 取得當前單元格的列?Index
Console.WriteLine(DataGridView1.CurrentCell.ColumnIndex);
// 取得當前單元格的行?Index
Console.WriteLine(DataGridView1.CurrentCell.RowIndex);
另外,使用 DataGridView.CurrentCellAddress 屬性(而不是直接訪問單元格)來確定單元格所在的
行:?DataGridView.CurrentCellAddress.Y
列: DataGridView.CurrentCellAddress.X 。這對于避免取消共享行的共享非常有用。
當前的單元格可以通過設定 DataGridView 對象的 CurrentCell 來改變。可以通過 CurrentCell 來設定?
DataGridView 的激活單元格。將 CurrentCell 設為 Nothing(null) 可以取消激活的單元格。?
--------------------------------------------------------------------------------
// 設定 (0, 0) 為當前單元格?
DataGridView1.CurrentCell = DataGridView1[0, 0];
在整行選中模式開啟時,你也可以通過 CurrentCell 來設定選定行。?
????????/// 向下遍歷?
????????private void button4_Click(object sender, EventArgs e)
????????...{
????????????int row = this.dataGridView1.CurrentRow.Index + 1;
????????????if (row > this.dataGridView1.RowCount - 1)
????????????????row = 0;
????????????this.dataGridView1.CurrentCell = this.dataGridView1[0, row];
????????}
????????/// 向上遍歷?
????????private void button5_Click(object sender, EventArgs e)
????????...{
????????????int row = this.dataGridView1.CurrentRow.Index - 1;
????????????if (row < 0)
????????????????row = this.dataGridView1.RowCount - 1;
????????????this.dataGridView1.CurrentCell = this.dataGridView1[0, row];
????????}
* 注意: this.dataGridView 的索引器的參數是: columnIndex, rowIndex 或是?columnName, rowIndex
這與習慣不同。
--------------------------------------------------------------------------------
② DataGridView?設定單元格只讀:
1) 使用 ReadOnly 屬性?
如果希望,DataGridView 內所有單元格都不可編輯, 那么只要:
// 設置 DataGridView1 為只讀?
DataGridView1.ReadOnly = true;此時,用戶的新增行操作和刪除行操作也被屏蔽了。
如果希望,DataGridView 內某個單元格不可編輯, 那么只要:
// 設置 DataGridView1 的第2列整列單元格為只讀?
DataGridView1.Columns[1].ReadOnly = true;
// 設置 DataGridView1 的第3行整行單元格為只讀?
DataGridView1.Rows[2].ReadOnly = true;
// 設置 DataGridView1 的[0,0]單元格為只讀?
DataGridView1[0, 0].ReadOnly = true;
2) 使用 EditMode 屬性?
DataGridView.EditMode 屬性被設置為 DataGridViewEditMode.EditProgrammatically 時,用戶就不能手動編輯單元格的內容了。但是可以通過程序,調用 DataGridView.BeginEdit 方法,使單元格進入編輯模式進行編輯。
DataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically;
3) 根據條件設定單元格的不可編輯狀態?
當一個一個的通過單元格坐標設定單元格 ReadOnly 屬性的方法太麻煩的時候,你可以通過 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;
????}
}
--------------------------------------------------------------------------------
③ DataGridView?不顯示最下面的新行:
通常 DataGridView 的最下面一行是用戶新追加的行(行頭顯示 * )。如果不想讓用戶新追加行即不想顯示該新行,可以將 DataGridView 對象的 AllowUserToAddRows 屬性設置為 False。
// 設置用戶不能手動給 DataGridView1 添加新行?
DataGridView1.AllowUserToAddRows = false;
但是,可以通過程序: DataGridViewRowCollection.Add 為 DataGridView 追加新行。
補足: 如果 DataGridView 的 DataSource 綁定的是 DataView, 還可以通過設置?DataView.AllowAdd
屬性為 False 來達到同樣的效果。?
--------------------------------------------------------------------------------
④ DataGridView?判斷新增行:
DataGridView 的AllowUserToAddRows屬性為True時也就是允許用戶追加新行的場合下,DataGridView的最后一行就是新追加的行(*行)。
使用 DataGridViewRow.IsNewRow 屬性可以判斷哪一行是新追加的行。另外,通過DataGridView.NewRowIndex 可以獲取新行的行序列號.
在沒有新行的時候,NewRowIndex = -1。
--------------------------------------------------------------------------------
⑤ DataGridView?行的用戶刪除操作的自定義:
1) 無條件的限制行刪除操作。?
默認時,DataGridView 是允許用戶進行行的刪除操作的。如果設置 DataGridView對象的AllowUserToDeleteRows屬性為 False 時, 用戶的行刪除操作就被禁止了。
// 禁止DataGridView1的行刪除操作。?
DataGridView1.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;
????}
}
--------------------------------------------------------------------------------
⑥ DataGridView?行、列的隱藏和刪除:
1) 行、列的隱藏
// DataGridView1的第一列隱藏?
DataGridView1.Columns[0].Visible = false;
// DataGridView1的第一行隱藏?
DataGridView1.Rows[0].Visible = false;
2) 行頭、列頭的隱藏
// 列頭隱藏?
DataGridView1.ColumnHeadersVisible = false;
// 行頭隱藏?
DataGridView1.RowHeadersVisible = false;
3) 行和列的刪除
' 刪除名為"Column1"的列?
DataGridView1.Columns.Remove("Column1");
' 刪除第一列
DataGridView1.Columns.RemoveAt(0);
' 刪除第一行?
DataGridView1.Rows.RemoveAt(0);
4) 刪除選中行
foreach (DataGridViewRow r in DataGridView1.SelectedRows)
{
????if (!r.IsNewRow)
????{
????????DataGridView1.Rows.Remove(r);
????}
}
--------------------------------------------------------------------------------
⑦?DataGridView?禁止列或者行的Resize:
1) 禁止所有的列或者行的Resize
// 禁止用戶改變DataGridView1的所有列的列寬?
DataGridView1.AllowUserToResizeColumns?= false;
//禁止用戶改變DataGridView1の所有行的行高?
DataGridView1.AllowUserToResizeRows = false;
但是可以通過 DataGridViewColumn.Width 或者 DataGridViewRow.Height 屬性設定列寬和行高。
2) 禁止指定行或者列的Resize
// 禁止用戶改變DataGridView1的第一列的列寬?
DataGridView1.Columns[0].Resizable = DataGridViewTriState.False;
// 禁止用戶改變DataGridView1的第一列的行寬?
DataGridView1.Rows[0].Resizable = DataGridViewTriState.False;
關于?NoSet :
當 Resizable 屬性設為 DataGridViewTriState.NotSet 時, 實際上會默認以 DataGridView 的 AllowUserToResizeColumns?和 AllowUserToResizeRows 的屬性值進行設定。
比如: DataGridView.AllowUserToResizeColumns?= False 且 Resizable 是 NoSet 設定時,Resizable = False 。
判斷 Resizable 是否是繼承設定了 DataGridView 的 AllowUserToResizeColumns?和 AllowUserToResizeRows 的屬性值,?
可以根據 State 屬性判斷。如果 State 屬性含有 ResizableSet,那么說明沒有繼承設定。
3) 列寬和行高的最小值的設定
// 第一列的最小列寬設定為?100
DataGridView1.Columns[0].MinimumWidth = 100;
// 第一行的最小行高設定為?50
DataGridView1.Rows[0].MinimumHeight = 50;
4) 禁止用戶改變行頭的寬度以及列頭的高度
// 禁止用戶改變列頭的高度?
DataGridView1.ColumnHeadersHeightSizeMode =
????DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
// 設置用戶改變行頭的寬度?
DataGridView1.RowHeadersWidthSizeMode =
????DataGridViewRowHeadersWidthSizeMode.EnableResizing;
--------------------------------------------------------------------------------
⑧ DataGridView?列寬和行高自動調整的設定:
1) 設定行高和列寬自動調整
// 設定包括Header和所有單元格的列寬自動調整?
DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
// 設定包括Header和所有單元格的行高自動調整?
DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
AutoSizeColumnsMode 屬性的設定值枚舉請參照 msdn 的 DataGridViewAutoSizeRowsMode 說明。
2)指定列或行自動調整
// 第一列自動調整?
DataGridView1.Columns[0].AutoSizeMode =
????DataGridViewAutoSizeColumnMode.DisplayedCells;
AutoSizeMode 設定為 NotSet 時, 默認繼承的是 DataGridView.AutoSizeColumnsMode 屬性。
3) 設定列頭的高度和行頭的寬度自動調整?
// 設定列頭的寬度可以自由調整?
DataGridView1.ColumnHeadersHeightSizeMode =
????DataGridViewColumnHeadersHeightSizeMode.AutoSize;
// 設定行頭的寬度可以自由調整?
DataGridView1.RowHeadersWidthSizeMode =
????DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
4) 隨時自動調整?
a, 臨時的,讓列寬自動調整,這和指定AutoSizeColumnsMode屬性一樣。?
// 讓 DataGridView1 的所有列寬自動調整一下。?
DataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
// 讓 DataGridView1 的第一列的列寬自動調整一下。?
DataGridView1.AutoResizeColumn(0, DataGridViewAutoSizeColumnMode.AllCells);上面調用的 AutoResizeColumns 和?AutoResizeColumn
當指定的是DataGridViewAutoSizeColumnMode.AllCells 的時候,參數可以省略。即:?
DataGridView1.AutoResizeColumn(0) 和 DataGridView1.AutoResizeColumns()
b,臨時的,讓行高自動調整
// 讓 DataGridView1 的所有行高自動調整一下。?
DataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCells);
//讓 DataGridView1 的第一行的行高自動調整一下。?
DataGridView1.AutoResizeRow(0, DataGridViewAutoSizeRowMode.AllCells);上面調用的 AutoResizeRows 和AutoResizeRow
當指定的是DataGridViewAutoSizeRowMode.AllCells 的時候,參數可以省略。即:DataGridView1.AutoResizeRow (0) 和 DataGridView1.AutoResizeRows()
c,臨時的,讓行頭和列頭自動調整
// 列頭高度自動調整?
DataGridView1.AutoResizeColumnHeadersHeight();
// 行頭寬度自動調整?
DataGridView1.AutoResizeRowHeadersWidth(
????DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders);
關于性能:?
通過 AutoSizeColumnsMode 或者 AutoSizeRowsMode 屬性所指定的單元格進行自動調整時,如果調整次數過于多那么將可能導致性能下降,
尤其是在行和列數比較多的情況下。在這時用 DisplayedCells 代替 AllCells 能減少非所見的單元格的調整,從而提高性能。?
--------------------------------------------------------------------------------
⑨ DataGridView?凍結列或行
1) 列凍結?
DataGridViewColumn.Frozen 屬性為 True 時, 該列左側的所有列被固定, 橫向滾動時固定列不隨滾動條滾動而左右移動。這對于重要列固定顯示很有用。
// DataGridView1的左側2列固定?
DataGridView1.Columns[1].Frozen = true;
但是,DataGridView.AllowUserToOrderColumns = True 時,固定列不能移動到非固定列, 反之亦然。
2) 行凍結?
DataGridViewRow.Frozen 屬性為 True 時, 該行上面的所有行被固定, 縱向滾動時固定行不隨滾動條滾動而上下移動。
// DataGridView1 的上3行固定?
DataGridView1.Rows[2].Frozen = true;
--------------------------------------------------------------------------------
⑩?DataGridView?列順序的調整
設定 DataGridView 的 AllowUserToOrderColumns 為 True 的時候, 用戶可以自由調整列的順序。?
當用戶改變列的順序的時候,其本身的 Index 不會改變,但是 DisplayIndex 改變了。你也可以通過程序改變 DisplayIndex 來改變列的順序。 列順序發生改變時會引發 ColumnDisplayIndexChanged 事件:
// DataGridView1的ColumnDisplayIndexChanged事件處理方法?
private void DataGridView1_ColumnDisplayIndexChanged(object sender,
????DataGridViewColumnEventArgs e)
{
????Console.WriteLine("{0} 的位置改變到?{1} ",
????????e.Column.Name, e.Column.DisplayIndex);
}
----------------
? 行頭列頭的單元格
[C#]
//?改變DataGridView1的第一列列頭內容
DataGridView1.Columns[0].HeaderCell.Value = "第一列";
// 改變DataGridView1的第一行行頭內容
DataGridView1.Rows[0].HeaderCell.Value = "第一行";
// 改變DataGridView1的左上頭部單元內容
DataGridView1.TopLeftHeaderCell.Value = "左上";
另外你也可以通過 HeaderText 來改變他們的內容。
[C#]
//?改變DataGridView1的第一列列頭內容
DataGridView1.Columns[0].HeaderText = "第一列";
??DataGridView?剪切板的操作
TOP
DataGridView.ClipboardCopyMode?屬性被設定為 DataGridViewClipboardCopyMode.Disable 以外的情況時,「Ctrl + C」 按下的時候,被選擇的單元格的內容會拷貝到系統剪切板內。格式有: Text, UnicodeText,Html, CommaSeparatedValue。可以直接粘貼到 Excel 內。
ClipboardCopyMode 還可以設定 Header部分是否拷貝: EnableAlwaysIncludeHeaderText 拷貝Header部分、EnableWithoutHeaderText 則不拷貝。默認是 EnableWithAutoHeaderText?, Header 如果選擇了的話,就拷貝。
1) 編程方式實現剪切板的拷貝
Clipboard.SetDataObject(DataGridView1.GetClipboardContent())
2) DataGridView 的數據粘貼
實現剪切板的拷貝比較容易,但是實現 DataGridView 的直接粘貼就比較難了。「Ctrl + V」按下進行粘貼時,DataGridView 沒有提供方法,只能自己實現。
以下,是粘貼時簡單的事例代碼,將拷貝數據粘貼到以選擇單元格開始的區域內。
[C#]
//當前單元格是否選擇的判斷
if (DataGridView1.CurrentCell == null)
????return;
int insertRowIndex = DataGridView1.CurrentCell.RowIndex;
// 獲取剪切板的內容,并按行分割
string pasteText = Clipboard.GetText();
if (string.IsNullOrEmpty(pasteText))
????return;
pasteText = pasteText.Replace(" ", " ");
pasteText = pasteText.Replace(' ', ' ');
pasteText.TrimEnd(new char[] { ' ' });
string[] lines = pasteText.Split(' ');
bool isHeader = true;
foreach (string line in lines)
{
????// 是否是列頭
????if (isHeader)
????{
????????isHeader = false;
????????continue;
????}
????// 按 Tab 分割數據
????string[] vals = line.Split(' ');
????//?判斷列數是否統一
????if (vals.Length - 1 != DataGridView1.ColumnCount)
????????throw new ApplicationException("粘貼的列數不正確。");
????DataGridViewRow row = DataGridView1.Rows[insertRowIndex];
????// 行頭設定
????row.HeaderCell.Value = vals[0];
????//?單元格內容設定
????for (int i = 0; i < row.Cells.Count; i++)
????{
????????row.Cells[i].Value = vals[i + 1];
????}
????// DataGridView的行索引+1
????insertRowIndex++;
}
________________________________________
? DataGridView?單元格的ToolTip的設置
DataGridView.ShowCellToolTips = True?的情況下, 單元格的 ToolTip 可以表示出來。對于單元格窄小,無法完全顯示的單元格, ToolTip 可以顯示必要的信息。
1) 設定單元格的ToolTip內容
[C#]
//?設定單元格的ToolTip內容
DataGridView1[0, 0].ToolTipText = "該單元格的內容不能修改";
// 設定列頭的單元格的ToolTip內容
DataGridView1.Columns[0].ToolTipText = "該列只能輸入數字";
// 設定行頭的單元格的ToolTip內容
DataGridView1.Rows[0].HeaderCell.ToolTipText = "該行單元格內容不能修改";
2) CellToolTipTextNeeded 事件
在批量的單元格的 ToolTip 設定的時候,一個一個指定那么設定的效率比較低, 這時候可以利用 CellToolTipTextNeeded 事件。當單元格的 ToolTipText 變化的時候也會引發該事件。但是,當DataGridView的DataSource被指定且VirualMode=True的時候,該事件不會被引發。
[C#]
// CellToolTipTextNeeded事件處理方法
private void DataGridView1_CellToolTipTextNeeded(object sender,
????DataGridViewCellToolTipTextNeededEventArgs e)
{
????e.ToolTipText = e.ColumnIndex.ToString() + ", " + e.RowIndex.ToString();
}
________________________________________
??DataGridView?的右鍵菜單(ContextMenuStrip)?
DataGridView, DataGridViewColumn, DataGridViewRow, DataGridViewCell?有 ContextMenuStrip 屬性。可以通過設定 ContextMenuStrip 對象來控制 DataGridView 的右鍵菜單的顯示。 DataGridViewColumn 的 ContextMenuStrip 屬性設定了 除了列頭以外的單元格的右鍵菜單。 DataGridViewRow 的 ContextMenuStrip 屬性設定了除了行頭以外的單元格的右鍵菜單。DataGridViewCell 的 ContextMenuStrip 屬性設定了指定單元格的右鍵菜單。
[C#]
// DataGridView?的 ContextMenuStrip 設定
DataGridView1.ContextMenuStrip = this.ContextMenuStrip1;
// 列的 ContextMenuStrip 設定
DataGridView1.Columns[0].ContextMenuStrip = this.ContextMenuStrip2;
//?列頭的 ContextMenuStrip 設定
DataGridView1.Columns[0].HeaderCell.ContextMenuStrip = this.ContextMenuStrip2;
// 行的 ContextMenuStrip 設定
DataGridView1.Rows[0].ContextMenuStrip = this.ContextMenuStrip3;
// 單元格的 ContextMenuStrip 設定
DataGridView1[0, 0].ContextMenuStrip = this.ContextMenuStrip4;
對于單元格上的右鍵菜單的設定,優先順序是: Cell > Row > Column > DataGridView
? CellContextMenuStripNeeded、RowContextMenuStripNeeded 事件
利用 CellContextMenuStripNeeded 事件可以設定單元格的右鍵菜單,尤其但需要右鍵菜單根據單元格值的變化而變化的時候。比起使用循環遍歷,使用該事件來設定右鍵菜單的效率更高。但是,在DataGridView使用了DataSource綁定而且是VirtualMode的時候,該事件將不被引發。
[C#]
// CellContextMenuStripNeeded事件處理方法
private void DataGridView1_CellContextMenuStripNeeded(object sender,
????DataGridViewCellContextMenuStripNeededEventArgs e)
{
????DataGridView dgv = (DataGridView)sender;
????if (e.RowIndex < 0)
????{
????????// 列頭的ContextMenuStrip設定
????????e.ContextMenuStrip = this.ContextMenuStrip1;
????}
????else if (e.ColumnIndex < 0)
????{
????????// 行頭的ContextMenuStrip設定
????????e.ContextMenuStrip = this.ContextMenuStrip2;
????}
????else if (dgv[e.ColumnIndex, e.RowIndex].Value is int)
????{
????????// 如果單元格值是整數時
????????e.ContextMenuStrip = this.ContextMenuStrip3;
????}
}
同樣,可以通過 RowContextMenuStripNeeded 事件來設定行的右鍵菜單。
[C#]
// RowContextMenuStripNeeded事件處理方法
private void DataGridView1_RowContextMenuStripNeeded(object sender,
????DataGridViewRowContextMenuStripNeededEventArgs e)
{
????DataGridView dgv = (DataGridView)sender;
????// 當"Column1"列是Bool型且為True時、設定其的ContextMenuStrip
????object boolVal = dgv["Column1", e.RowIndex].Value;
????Console.WriteLine(boolVal);
????if (boolVal is bool && (bool)boolVal)
????{
????????e.ContextMenuStrip = this.ContextMenuStrip1;
????}
}
CellContextMenuStripNeeded 事件處理方法的參數中、「e.ColumnIndex=-1」表示行頭、「e.RowIndex=-1」表示列頭。RowContextMenuStripNeeded則不存在「e.RowIndex=-1」的情況。
________________________________________
? DataGridView?的單元格的邊框、網格線樣式的設定
1) DataGridView?的邊框線樣式的設定
DataGridView?的邊框線的樣式是通過 DataGridView.BorderStyle 屬性來設定的。 BorderStyle 屬性設定值是一個
BorderStyle?枚舉: FixedSingle(單線,默認)、Fixed3D、None。
2) 單元格的邊框線樣式的設定
單元格的邊框線的樣式是通過 DataGridView.CellBorderStyle 屬性來設定的。 CellBorderStyle 屬性設定值是
DataGridViewCellBorderStyle?枚舉。(詳細參見 MSDN)
另外,通過 DataGridView.ColumnHeadersBorderStyle?和 RowHeadersBorderStyle 屬性可以修改 DataGridView 的頭部的單元格邊框線樣式。 屬性設定值是 DataGridViewHeaderBorderStyle 枚舉。(詳細參見 MSDN)
3) 單元格的邊框顏色的設定
單元格的邊框線的顏色可以通過 DataGridView.GridColor 屬性來設定的。默認是 ControlDarkDark 。但是只有在 CellBorderStyle 被設定為 Single、SingleHorizontal、SingleVertical 的條件下才能改變其邊框線的顏色。同樣,ColumnHeadersBorderStyle?以及 RowHeadersBorderStyle 只有在被設定為 Single 時,才能改變顏色。
4) 單元格的上下左右的邊框線式樣的單獨設定
CellBorderStyle只能設定單元格全部邊框線的式樣。要單獨改變單元格某一邊邊框式樣的話,需要用到DataGridView.AdvancedCellBorderStyle屬性。如示例:
[VB.NET]
'?單元格的上邊和左邊線設為二重線
'?單元格的下邊和右邊線設為單重線
DataGridView1.AdvancedCellBorderStyle.Top = _
????DataGridViewAdvancedCellBorderStyle.InsetDouble
DataGridView1.AdvancedCellBorderStyle.Right = _
????DataGridViewAdvancedCellBorderStyle.Inset
DataGridView1.AdvancedCellBorderStyle.Bottom = _
????DataGridViewAdvancedCellBorderStyle.Inset
DataGridView1.AdvancedCellBorderStyle.Left = _
????DataGridViewAdvancedCellBorderStyle.InsetDouble
同樣,設定行頭單元格的屬性是: AdvancedRowHeadersBorderStyle, 設定列頭單元格屬性是:AdvancedColumnHeadersBorderStyle。
________________________________________
? DataGridView?單元格表示值的自定義
通過CellFormatting事件,可以自定義單元格的表示值。(比如:值為Error的時候,單元格被設定為紅色)
下面的示例:將“Colmn1”列的值改為大寫。
[C#]
//CellFormatting?事件處理方法
private void DataGridView1_CellFormatting(object sender,
????DataGridViewCellFormattingEventArgs e)
{
????DataGridView dgv = (DataGridView)sender;
????// 如果單元格是“Column1”列的單元格
????if (dgv.Columns[e.ColumnIndex].Name == "Column1" && e.Value is string)
????{
????????//?將單元格值改為大寫
????????string str = e.Value.ToString();
????????e.Value = str.ToUpper();
????????//?應用該Format,Format完畢。
????????e.FormattingApplied = true;
????}
}
CellFormatting事件的DataGridViewCellFormattingEventArgs對象的Value屬性一開始保存著未被格式化的值。當Value屬性被設定表示用的文本之后,把FormattingApplied屬性做為True,告知DataGridView文本已經格式化完畢。如果不這樣做的話,DataGridView會根據已經設定的Format,NullValue,DataSourceNullValue,FormatProvider屬性會將Value屬性會被重新格式化一遍。
________________________________________
? DataGridView?用戶輸入時,單元格輸入值的設定
通過 DataGridView.CellParsing 事件可以設定用戶輸入的值。下面的示例:當輸入英文文本內容的時候,立即被改變為大寫。
[C#]
//CellParsing?事件處理方法
private void DataGridView1_CellParsing(object sender,
????DataGridViewCellParsingEventArgs e)
{
????DataGridView dgv = (DataGridView)sender;
????//單元格列為“Column1”時
????if (dgv.Columns[e.ColumnIndex].Name == "Column1" &&
????????e.DesiredType == typeof(string))
????{
????????//將單元格值設為大寫
????????e.Value = e.Value.ToString().ToUpper();
????????//解析完畢
????????e.ParsingApplied = true;
????}
}
________________________________________
? DataGridView?新加行的默認值的設定
需要指定新加行的默認值的時候,可以在DataGridView.DefaultValuesNeeded事件里處理。在該事件中處理除了可以設定默認值以外,還可以指定某些特定的單元格的ReadOnly屬性等。
[C#]
// DefaultValuesNeeded?事件處理方法
private void DataGridView1_DefaultValuesNeeded(object sender,
????DataGridViewRowEventArgs?e)
{
????//?設定單元格的默認值
????e.Row.Cells["Column1"].Value = 0;
????e.Row.Cells["Column2"].Value = "-";
}
DataGridView的中的查找,添加,刪除行
public class DVOP
????{
????????/// <summary>
????????/// DataGridView中查找指定列中的指定值,并選中該單元格
????????/// </summary>
????????/// <param name="dv">DataGridView控件</param>
????????/// <param name="colnumber">找查的指定列</param>
????????/// <param name="str">查找的指定值</param>
????????/// <returns>如果有查找的值返回true,沒有則返回false</returns>
????????public bool Select(DataGridView dv, string colname, string str)
????????{
????????????bool selected = false;
????????????int row = dv.Rows.Count;//得到總行數?
????????????for (int i = 0; i < row; i++)//得到總行數并在之內循環?
????????????{
????????????????if (str == dv.Rows[i].Cells[colname].Value.ToString())
????????????????{???//對比TexBox中的值是否與dataGridView中的值相同(上面這句)?
????????????????????dv.CurrentCell = dv[colname, i];//定位到相同的單元格?
????????????????????selected = true;
????????????????????return selected;//返回?
????????????????}
????????????}
????????????return selected;
????????}
????????/// <summary>
????????/// 向DataGirdView中添加行,顯示在第一行,并選中該行
????????/// </summary>
????????/// <param name="dv">DataGridView對向</param>
????????/// <param name="colcount">總列數</param>
????????/// <param name="colvalues">要添加的每列的值</param>
????????public void AddRow(DataGridView dv, int colcount,params string[] colvalues)
????????{
????????????DataGridViewRow dr = new DataGridViewRow();
????????????dr.CreateCells(dv);
????????????for (int i = 0; i < colcount; i++)
????????????{
????????????????dr.Cells[i].Value = colvalues[i];
????????????}
????????????dv.Rows.Insert(0, dr);
????????????dv.CurrentCell = dv.Rows[0].Cells[0];
????????}
????????/// <summary>
????????/// 刪除DV中的指定行
????????/// </summary>
????????/// <param name="dv">DataGridView對向</param>
????????/// <param name="colindex">要刪除的指定行</param>
????????public void ReMoveRow(DataGridView dv, int colindex)
????????{
????????????dv.Rows.Remove(dv.Rows[colindex]);
????????????dv.ClearSelection();
????????}
????}
0(最基本的技巧)、獲取某列中的某行(某單元格)中的內容
?
this.currentposition = this.dataGridView1.BindingContext [this.dataGridView1.DataSource, this.dataGridView1.DataMember].Position;bookContent = this.database.dataSet.Tables[0].Rows [this.currentposition][21].ToString().Trim();MessageBox.Show(bookContent);
?
?
?
?
????1、自定義列
?
?
//定義列寬this.dataGridView1.Columns[0].Width = 80;this.dataGridView1.Columns[1].Width = 80;this.dataGridView1.Columns[2].Width = 180;this.dataGridView1.Columns[3].Width = 120;this.dataGridView1.Columns[4].Width = 120;Customize Cells and Columns in the Windows Forms DataGridView Control by Extending TheirBehavior and AppearanceHost Controls in Windows Forms DataGridView Cells
?
?
????繼承 DataGridViewTextBoxCell 類生成新的Cell類,然后再繼承 DataGridViewColumn 生成新的Column類,并指定
CellTemplate為新的Cell類。新生成的Column便可以增加到DataGridView中去。
?
????2、自動適應列寬
?
Programmatically Resize Cells to Fit Content in the Windows Forms DataGridView ControlSamples:DataGridView.AutoSizeColumns(DataGridViewAutoSizeColumnCriteria.HeaderAndDisplayedRows);DataGridView.AutoSizeColumn(DataGridViewAutoSizeColumnCriteria.HeaderOnly,2, false);DataGridView.AutoSizeRow(DataGridViewAutoSizeRowCriteria.Columns,2, false);DataGridView.AutoSizeRows(DataGridViewAutoSizeRowCriteria.HeaderAndColumns,0, dataGridView1.Rows.Count, false);
?
?
?
????3、可以綁定并顯示對象
?
Bind Objects to Windows Forms DataGridView Controls
?
?
????4、可以改變表格線條風格
?
Change the Border and Gridline Styles in the Windows Forms DataGridView ControlSamples:this.dataGridView1.GridColor = Color.BlueViolet;this.dataGridView1.BorderStyle = BorderStyle.Fixed3D;this.dataGridView1.CellBorderStyle = DataGridViewCellBorderStyle.None;this.dataGridView1.RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single;this.dataGridView1.ColumnHeadersBorderStyle?= DataGridViewHeaderBorderStyle.Single;
?
?
????5、動態改變列是否顯示,和動態改變列的顯示順序
?
Change the Order of the Columns in the Windows Forms DataGridView ControlSamples:customersDataGridView.Columns["CustomerID"].Visible = false;customersDataGridView.Columns["ContactName"].DisplayIndex = 0;customersDataGridView.Columns["ContactTitle"].DisplayIndex = 1;customersDataGridView.Columns["City"].DisplayIndex = 2;customersDataGridView.Columns["Country"].DisplayIndex = 3;customersDataGridView.Columns["CompanyName"].DisplayIndex = 4;
?
?
????6、可以在列中顯示圖像
?
Display Images in Cells of the Windows Forms DataGridView ControlSamples:Icon treeIcon = new Icon(this.GetType(), "tree.ico");DataGridViewImageColumn iconColumn = new DataGridViewImageColumn ();iconColumn.Image = treeIcon.ToBitmap();iconColumn.Name = "Tree";iconColumn.HeaderText = "Nice tree";dataGridView1.Columns.Insert(2, iconColumn);
?
?
????7、格式化顯示內容:
?
Format Data in the Windows Forms DataGridView ControlSamples:this.dataGridView1.Columns["UnitPrice"].DefaultCellStyle.Format = "c";this.dataGridView1.Columns["ShipDate"].DefaultCellStyle.Format = "d";this.dataGridView1.DefaultCellStyle.NullValue = "no entry";this.dataGridView1.DefaultCellStyle.WrapMode = DataGridViewWrapMode.Wrap;this.dataGridView1.Columns["CustomerName"].DefaultCellStyle.Alignment =DataGridViewContentAlignment.MiddleRight;
?
?
????8、在拖動列的滾動條時可以將指定的列凍結
?
Freeze Columns in the Windows Forms DataGridView ControlSamples:將指定列及以前的列固定不動this.dataGridView1.Columns["AddToCartButton"].Frozen = true;
?
?
????9、獲取選擇的單元格,行,列
Get the Selected Cells, Rows, and Columns in the Windows Forms DataGridView ControlSamples:
?
?
????10、顯示錄入時出現的錯誤信息
?
Handle Errors that Occur During Data Entry in the Windows Forms DataGridView ControlSamples:private void dataGridView1_DataError(object sender,DataGridViewDataErrorEventArgs e){// If the data source raises an exception when a cell value is// commited, display an error message.if (e.Exception != null &&e.Context == DataGridViewDataErrorContext.Commit){MessageBox.Show("CustomerID value must be unique.");}}
?
?
????11、大數據量顯示采用Virtual Mode
?
Implement Virtual Mode in the Windows Forms DataGridView Control
?
?
????12、設置指定的列只讀
?
Make Columns in the Windows Forms DataGridView Control Read-OnlySamples:dataGridView1.Columns["CompanyName"].ReadOnly = true;
?
?
????13、移去自動生成的列
?
Remove Autogenerated Columns from a Windows Forms DataGridView ControlSample:dataGridView1.AutoGenerateColumns = true;dataGridView1.DataSource = customerDataSet;dataGridView1.Columns.Remove ("Fax");或:dataGridView1.Columns["CustomerID"].Visible = false;
?
?
????14、自定義選擇模式
?
Set the Selection Mode of the Windows Forms DataGridView ControlSample:this.dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;this.dataGridView1.MultiSelect = false;
?
?
????15、自定義設定光標進入單元格是否編輯模式(編輯模式)
?
Specify the Edit Mode for the Windows Forms DataGridView Controlthis.dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;
?
?
????16、新行指定默認值
?
Specify Default Values for New Rows in the Windows Forms DataGridView ControlSample:private void dataGridView1_DefaultValuesNeeded(object sender, System.Windows.Forms.DataGridViewRowEventArgs?e){e.Row.Cells["Region"].Value = "WA";e.Row.Cells["City"].Value = "Redmond";e.Row.Cells["PostalCode"].Value = "98052-6399";e.Row.Cells["Region"].Value = "NA";e.Row.Cells["Country"].Value = "USA";e.Row.Cells["CustomerID"].Value = NewCustomerId();}
?
?
????17、數據驗證
?
Validate Data in the Windows Forms DataGridView ControlSamples:private void dataGridView1_CellValidating(object sender,DataGridViewCellValidatingEventArgs e){// Validate the CompanyName entry by disallowing empty strings.if (dataGridView1.Columns[e.ColumnIndex].Name == "CompanyName"){if (e.FormattedValue.ToString() == String.Empty){dataGridView1.Rows[e.RowIndex].ErrorText ="Company Name must not be empty";e.Cancel = true;}}}
?
?
????18、數據提交到dataset中
?
DataSet ds = new DataSet("MyDataSet");ds.Tables[biaom.Trim()].Rows.Clear();try{for (int i = 0; i < dataGridView1.Rows.Count - 1; i++){DataTable dt = ds.Tables[biaom.Trim()];DataRow myrow = ds.Tables[biaom.Trim()].NewRow();for (int j = 0; j < dataGridView1.Columns.Count; j++){myrow[j] = Convert.ToString(dataGridView1.Rows[i].Cells[j].Value);}ds.Tables[biaom.Trim()].Rows.Add(myrow);}}catch (Exception){MessageBox.Show("輸入類型錯誤!");return;}?
轉載于:https://www.cnblogs.com/FLWL/p/3906640.html
總結
以上是生活随笔為你收集整理的C# winform DataGridView 操作大全的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 知识点
- 下一篇: 分享基于分布式Http长连接框架--设计