DataGridView常用屬性

DataGridView常用屬性
只讀屬性設定
        datagridview.ReadOnly = True
        行自動追加
        datagridview.AllowUserToAddRows = False


        刪除行允許
        datagridview.AllowUserToDeleteRows = False


        行幅設置
        datagridview.AllowUserToResizeRows = False
      datagridview.ColumnHeadersHeightSizeMode =DataGridViewColumnHeadersHeightSizeMode.DisableResizing


        行表示
        datagridview.RowHeadersVisible = False


        行選擇模式
        datagridview.SelectionMode = DataGridViewSelectionMode.FullRowSelect


        複數行選擇
        datagridview.MultiSelect = True


        選擇狀態解除
        datagridview.ClearSelection()


        文字設置位置
        datagridview.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter


        選擇後行的顏色
        datagridview.DefaultCellStyle.SelectionBackColor = Color.GreenYellow
        datagridview.DefaultCellStyle.SelectionForeColor = Color.Black


        行幅自動調整
        datagridview.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill


DataGridView常用屬性、方法
1、自定義列
Customize Cells and Columns in the Windows Forms DataGridView Control by Extending Their
Behavior and Appearance
Host 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 Control
Samples:
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 Control
Samples:
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 Control
Samples:
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 Control
Samples:
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 Control
Samples:
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 Control
Samples:將指定列及以前的列固定不動
this.dataGridView1.Columns["AddToCartButton"].Frozen = true;
9、獲取選擇的單元格,行,列
Get the Selected Cells, Rows, and Columns in the Windows Forms DataGridView Control
Samples:
見msdn。
10、顯示錄入時出現的錯誤信息
Handle Errors that Occur During Data Entry in the Windows Forms DataGridView Control
Samples:
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-Only
Samples:
dataGridView1.Columns["CompanyName"].ReadOnly = true;
13、移去自動生成的列
Remove Autogenerated Columns from a Windows Forms DataGridView Control
Sample:
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 Control
Sample:
this.dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
this.dataGridView1.MultiSelect = false;
15、自定義設定光標進入單元格是否編輯模式(編輯模式)
Specify the Edit Mode for the Windows Forms DataGridView Control
this.dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;
16、新行指定默認值
Specify Default Values for New Rows in the Windows Forms DataGridView Control
Sample:
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 Control
Samples:
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;
}
}
}

⑦ DataGridView 禁止列或者行的Resize:

 

 

① DataGridView  取得或者修改當前單元格的內容:

當前單元格指的是 DataGridView 焦點所在的單元格,它可以通過 DataGridView 對象的 CurrentCell 屬性取得。如果當前單元格不存在的時候,返回Nothing(C#是null)

[C#]
// 取得當前單元格內容
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) 可以取消激活的單元格。

[C#]
// 設定 (0, 0)  爲當前單元格
DataGridView1.CurrentCell = DataGridView1[0, 0];
在整行選中模式開啓時,你也可以通過 CurrentCell 來設定選定行。
        /**//// <summary>
        /// 向下遍歷
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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]; 
        }

        /**//// <summary>
        /// 向上遍歷
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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 內所有單元格都不可編輯, 那麼只要:
[VB.NET]
' 設置 DataGridView1 爲只讀
DataGridView1.ReadOnly = True
[C#]
// 設置 DataGridView1 爲只讀
DataGridView1.ReadOnly = true;此時,用戶的新增行操作和刪除行操作也被屏蔽了。

? 如果希望,DataGridView 內某個單元格不可編輯, 那麼只要:

[C#]
// 設置 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 方法,使單元格進入編輯模式進行編輯。

[C#]
DataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically;
3) 根據條件設定單元格的不可編輯狀態
當一個一個的通過單元格座標設定單元格 ReadOnly 屬性的方法太麻煩的時候,你可以通過 CellBeginEdit 事件來取消單元格的編輯。

[C#]
// 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。

[C#]
// 設置用戶不能手動給 DataGridView1 添加新行
DataGridView1.AllowUserToAddRows = false;
但是,可以通過程序: DataGridViewRowCollection.Add 爲 DataGridView 追加新行。

補足: 如果 DataGridView 的 DataSource 綁定的是 DataView, 還可以通過設置 DataView.AllowAdd
屬性爲 False 來達到同樣的效果。


--------------------------------------------------------------------------------
④ DataGridView  判斷新增行:

GO TO TOP

DataGridView的AllowUserToAddRows屬性爲True時也就是允許用戶追加新行的場合下,DataGridView的 最後一行就是新追加的行(*行)。使用 DataGridViewRow.IsNewRow 屬性可以判斷哪一行是新追加的行。另外,通過DataGridView.NewRowIndex 可以獲取新行的行序列號。在沒有新行的時候,NewRowIndex = -1。 [VB.NET]
If DataGridView1.CurrentRow.IsNewRow Then
    Console.WriteLine("當前行爲新追加行。")
Else
    Console.WriteLine("當前行不是新追加行。")
End If

--------------------------------------------------------------------------------
⑤ DataGridView  行的用戶刪除操作的自定義:

GO TO TOP

1) 無條件的限制行刪除操作。
默認時,DataGridView 是允許用戶進行行的刪除操作的。如果設置 DataGridView對象的AllowUserToDeleteRows屬性爲 False 時, 用戶的行刪除操作就被禁止了。

[C#]
// 禁止DataGridView1的行刪除操作。
DataGridView1.AllowUserToDeleteRows = false;
但是,通過 DataGridViewRowCollection.Remove 還是可以進行行的刪除。
補足: 如果 DataGridView 綁定的是 DataView 的話,通過 DataView.AllowDelete 也可以控制行的刪除。

2) 行刪除時的條件判斷處理。
用戶在刪除行的時候,將會引發 DataGridView.UserDeletingRow 事件。 在這個事件裏,可以判斷條件並取消刪除操作。

--------------------------------------------------------------------------------
⑥ DataGridView  行、列的隱藏和刪除:
 

1) 行、列的隱藏
[VB.NET]
' DataGridView1的第一列隱藏
DataGridView1.Columns(0).Visible = False
' DataGridView1的第一行隱藏
DataGridView1.Rows(0).Visible = False
[C#]
// DataGridView1的第一列隱藏
DataGridView1.Columns[0].Visible = false;
// DataGridView1的第一行隱藏
DataGridView1.Rows[0].Visible = false;
2) 行頭、列頭的隱藏

[C#]
// 列頭隱藏
DataGridView1.ColumnHeadersVisible = false;
// 行頭隱藏
DataGridView1.RowHeadersVisible = false;
3) 行和列的刪除


[C#]
' 刪除名爲"Column1"的列
DataGridView1.Columns.Remove("Column1");
' 刪除第一列
DataGridView1.Columns.RemoveAt(0);
' 刪除第一行
DataGridView1.Rows.RemoveAt(0);
4) 刪除選中行

[C#]
foreach (DataGridViewRow r in DataGridView1.SelectedRows)
{
    if (!r.IsNewRow)
    {
        DataGridView1.Rows.Remove(r);
    }
}

--------------------------------------------------------------------------------
⑦ DataGridView 禁止列或者行的Resize:

 

1) 禁止所有的列或者行的Resize
[VB.NET]
' 禁止用戶改變DataGridView1的所有列的列寬
DataGridView1.AllowUserToResizeColumns = False

'禁止用戶改變DataGridView1の所有行的行高
DataGridView1.AllowUserToResizeRows = False
[C#]
// 禁止用戶改變DataGridView1的所有列的列寬
DataGridView1.AllowUserToResizeColumns = false;

//禁止用戶改變DataGridView1の所有行的行高
DataGridView1.AllowUserToResizeRows = false;
但是可以通過 DataGridViewColumn.Width 或者 DataGridViewRow.Height 屬性設定列寬和行高。

2) 禁止指定行或者列的Resize

[C#]
// 禁止用戶改變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) 列寬和行高的最小值的設定

[C#]
// 第一列的最小列寬設定爲 100
DataGridView1.Columns[0].MinimumWidth = 100;

// 第一行的最小行高設定爲 50
DataGridView1.Rows[0].MinimumHeight = 50;
4) 禁止用戶改變行頭的寬度以及列頭的高度

[C#]
// 禁止用戶改變列頭的高度
DataGridView1.ColumnHeadersHeightSizeMode =
    DataGridViewColumnHeadersHeightSizeMode.DisableResizing;

// 禁止用戶改變行頭的寬度
DataGridView1.RowHeadersWidthSizeMode =
    DataGridViewRowHeadersWidthSizeMode.EnableResizing;


--------------------------------------------------------------------------------
⑧ DataGridView 列寬和行高自動調整的設定:


1) 設定行高和列寬自動調整

[C#]
// 設定包括Header和所有單元格的列寬自動調整
DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

// 設定包括Header和所有單元格的行高自動調整
DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
AutoSizeColumnsMode 屬性的設定值枚舉請參照 msdn 的 DataGridViewAutoSizeRowsMode 說明。

2)指定列或行自動調整

[C#]
// 第一列自動調整
DataGridView1.Columns[0].AutoSizeMode =
    DataGridViewAutoSizeColumnMode.DisplayedCells;
AutoSizeMode 設定爲 NotSet  時, 默認繼承的是  DataGridView.AutoSizeColumnsMode 屬性。

3) 設定列頭的高度和行頭的寬度自動調整 [VB.NET]
'  設定列頭的寬度可以自由調整
DataGridView1.ColumnHeadersHeightSizeMode = _
    DataGridViewColumnHeadersHeightSizeMode.AutoSize

'  設定行頭的寬度可以自由調整
DataGridView1.RowHeadersWidthSizeMode = _
    DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders
[C#]
// 設定列頭的寬度可以自由調整
DataGridView1.ColumnHeadersHeightSizeMode =
    DataGridViewColumnHeadersHeightSizeMode.AutoSize;

// 設定行頭的寬度可以自由調整
DataGridView1.RowHeadersWidthSizeMode =
    DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
4) 隨時自動調整
a, 臨時的,讓列寬自動調整,這和指定AutoSizeColumnsMode屬性一樣。 [VB.NET]
' 讓 DataGridView1 的所有列寬自動調整一下。
DataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells)

' 讓 DataGridView1 的第一列的列寬自動調整一下。
DataGridView1.AutoResizeColumn(0, DataGridViewAutoSizeColumnMode.AllCells)
[C#]
// 讓 DataGridView1 的所有列寬自動調整一下。
DataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);

// 讓 DataGridView1 的第一列的列寬自動調整一下。
DataGridView1.AutoResizeColumn(0, DataGridViewAutoSizeColumnMode.AllCells);上面調用的 AutoResizeColumns 和 AutoResizeColumn 當指定的是DataGridViewAutoSizeColumnMode.AllCells 的時候, 參數可以省略。即:
DataGridView1.AutoResizeColumn(0) 和 DataGridView1.AutoResizeColumns()

b,臨時的,讓行高自動調整

[C#]
// 讓 DataGridView1 的所有行高自動調整一下。
DataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCells);

//讓 DataGridView1 的第一行的行高自動調整一下。
DataGridView1.AutoResizeRow(0, DataGridViewAutoSizeRowMode.AllCells);上面調用的 AutoResizeRows 和 AutoResizeRow 當指定的是DataGridViewAutoSizeRowMode.AllCells 的時候, 參數可以省略。即:DataGridView1.AutoResizeRow (0) 和 DataGridView1.AutoResizeRows()

c,臨時的,讓行頭和列頭自動調整

[C#]
// 列頭高度自動調整
DataGridView1.AutoResizeColumnHeadersHeight();

// 行頭寬度自動調整
DataGridView1.AutoResizeRowHeadersWidth(
    DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders);
關於性能:
通過 AutoSizeColumnsMode 或者 AutoSizeRowsMode 屬性所指定的單元格進行自動調整時,如果調整次數過於多那麼將可能導致性能下降,尤其是在行和列數比較多的情況下。在這時用 DisplayedCells 代替 AllCells 能減少非所見的單元格的調整,從而提高性能。


--------------------------------------------------------------------------------
⑨ DataGridView 凍結列或行

1) 列凍結
DataGridViewColumn.Frozen 屬性爲 True 時, 該列左側的所有列被固定, 橫向滾動時固定列不隨滾動條滾動而左右移動。這對於重要列固定顯示很有用。

[C#]
// DataGridView1的左側2列固定
DataGridView1.Columns[1].Frozen = true;
但是,DataGridView.AllowUserToOrderColumns = True 時,固定列不能移動到非固定列, 反之亦然。

2) 行凍結
DataGridViewRow.Frozen 屬性爲 True 時, 該行上面的所有行被固定, 縱向滾動時固定行不隨滾動條滾動而上下移動。

[C#]
// DataGridView1 的上3行固定
DataGridView1.Rows[2].Frozen = true;


--------------------------------------------------------------------------------
⑩ DataGridView 列順序的調整


設定 DataGridView 的 AllowUserToOrderColumns 爲 True 的時候, 用戶可以自由調整列的順序。
當用戶改變列的順序的時候,其本身的 Index 不會改變,但是 DisplayIndex 改變了。你也可以通過程序改變 DisplayIndex 來改變列的順序。 列順序發生改變時會引發 ColumnDisplayIndexChanged 事件:

[C#]
// DataGridView1的ColumnDisplayIndexChanged事件處理方法
private void DataGridView1_ColumnDisplayIndexChanged(object sender,
    DataGridViewColumnEventArgs e)
{
    Console.WriteLine("{0} 的位置改變到 {1} ",
        e.Column.Name, e.Column.DisplayIndex);
}

--------------------------------------------------------------------------------
? DataGridView 行頭列頭的單元格

[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 剪切板的操作

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;
    }
}

[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屬性。如示例:

--------------------------------------------------------------------------------
? 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 = "-";
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章