DataGridView使用技巧

.NET 2.0 - WinForm Control - DataGridView 編程36計(一)

目錄:

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

 設定單元格只讀

 不顯示最下面的新行

 判斷新增行

 行的用戶刪除操作的自定義


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

GO TO TOP

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

[VB.NET]
取得當前單元格內容
Console.WriteLine(DataGridView1.CurrentCell.Value)
取得當前單元格的列 Index
Console.WriteLine(DataGridView1.CurrentCell.ColumnIndex)
'
取得當前單元格的行 Index
Console.WriteLine(DataGridView1.CurrentCell.RowIndex)

 

[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) 可以取消激活的單元格。

[VB.NET]
設定 (0, 0)  爲當前單元格
DataGridView1.CurrentCell = DataGridView1(0, 0)

 

[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  設定單元格只讀:

GO TO TOP

1)使用 ReadOnly 屬性
? 如果希望,DataGridView 內所有單元格都不可編輯,那麼只要:

[VB.NET]
設置 DataGridView1 爲只讀
DataGridView1.ReadOnly = True

 

[C#]
//
設置 DataGridView1 爲只讀
DataGridView1.ReadOnly = true;

此時,用戶的新增行操作和刪除行操作也被屏蔽了。

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

[VB.NET]
'
設置 DataGridView1 的第2列整列單元格爲只讀
DataGridView1.Columns(1).ReadOnly = True

'
設置 DataGridView1 的第3行整行單元格爲只讀
DataGridView1.Rows(2).ReadOnly = True

'
設置 DataGridView1 [00]單元格爲只讀
DataGridView1(0, 0).ReadOnly = True

 

[C#]
//
設置 DataGridView1 的第2列整列單元格爲只讀
DataGridView1.Columns[1].ReadOnly = true;

//
設置 DataGridView1 的第3行整行單元格爲只讀
DataGridView1.Rows[2].ReadOnly = true;

//
設置 DataGridView1 [00]單元格爲只讀
DataGridView1[0, 0].ReadOnly = true;


2)使用 EditMode 屬性
DataGridView.EditMode 屬性被設置爲 DataGridViewEditMode.EditProgrammatically 時,用戶就不能手動編輯單元格的內容了。但是可以通過程序,調用 DataGridView.BeginEdit 方法,使單元格進入編輯模式進行編輯。

[VB.NET]
DataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically

 

[C#]
DataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically;


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

[VB.NET]
'CellBeginEdit
事件處理方法
Private Sub DataGridView1_CellBeginEdit(ByVal sender As Object, _
        ByVal e As DataGridViewCellCancelEventArgs) _
        Handles DataGridView1.CellBeginEdit
    Dim dgv As DataGridView = CType(sender, DataGridView)
    '
是否可以進行編輯的條件檢查
    If dgv.Columns(e.ColumnIndex).Name = "Column1" AndAlso _
        Not CBool(dgv("Column2", e.RowIndex).Value) Then
        '
取消編輯
        e.Cancel = True
    End If
End Sub

 

[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  不顯示最下面的新行:

GO TO TOP

通常 DataGridView 的最下面一行是用戶新追加的行(行頭顯示 * )。如果不想讓用戶新追加行即不想顯示該新行,可以將 DataGridView 對象的 AllowUserToAddRows 屬性設置爲 False

[VB.NET]
'
設置用戶不能手動給 DataGridView1 添加新行
DataGridView1.AllowUserToAddRows = False

 

[C#]
//
設置用戶不能手動給 DataGridView1 添加新行
DataGridView1.AllowUserToAddRows = false;

但是,可以通過程序: DataGridViewRowCollection.Add DataGridView 追加新行。

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


④ DataGridView  判斷新增行:

GO TO TOP

DataGridViewAllowUserToAddRows屬性爲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 時,用戶的行刪除操作就被禁止了。

[VB.NET]
'
禁止DataGridView1的行刪除操作。
DataGridView1.AllowUserToDeleteRows = False

 

[C#]
//
禁止DataGridView1的行刪除操作。
DataGridView1.AllowUserToDeleteRows = false;


但是,通過 DataGridViewRowCollection.Remove 還是可以進行行的刪除。
補足:如果 DataGridView 綁定的是 DataView 的話,通過 DataView.AllowDelete 也可以控制行的刪除。

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

[VB.NET]
' DataGridView1
UserDeletingRow 事件
Private Sub DataGridView1_UserDeletingRow(ByVal sender As Object, _
        ByVal e As DataGridViewRowCancelEventArgs) _
        Handles DataGridView1.UserDeletingRow
    ' 
刪除前的用戶確認。
    If MessageBox.Show("確認要刪除該行數據嗎?", "刪除確認", _
        MessageBoxButtons.OKCancel, MessageBoxIcon.Question) <> _
            Windows.Forms.DialogResult.OK Then
        ' 
如果不是 OK,則取消。
        e.Cancel = True
    End If
End Sub

 

[C#]
// DataGridView1
UserDeletingRow 事件
private void DataGridView1_UserDeletingRow(
    object sender, DataGridViewRowCancelEventArgs e)
{
    //
刪除前的用戶確認。
    if (MessageBox.Show("確認要刪除該行數據嗎?", "刪除確認",
        MessageBoxButtons.OKCancel,
        MessageBoxIcon.Question) != DialogResult.OK)
    {
        //
如果不是 OK,則取消。
        e.Cancel = true;
    }
}

 


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

GO TO TOP

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)行頭、列頭的隱藏

[VB.NET]
列頭隱藏
DataGridView1.ColumnHeadersVisible = False
行頭隱藏
DataGridView1.RowHeadersVisible = False

 

[C#]
// 
列頭隱藏
DataGridView1.ColumnHeadersVisible = false;
// 
行頭隱藏
DataGridView1.RowHeadersVisible = false;


3)行和列的刪除

[VB.NET]
'
刪除名爲"Column1"的列
DataGridView1.Columns.Remove("Column1")
'
刪除第一列
DataGridView1.Columns.RemoveAt(0)
'
刪除第一行
DataGridView1.Rows.RemoveAt(0)

 

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


4)刪除選中行

[VB.NET]
For Each r As DataGridViewRow In DataGridView1.SelectedRows
    If Not r.IsNewRow Then
        DataGridView1.Rows.Remove(r)
    End If
Next

 

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

 


DataGridView 禁止列或者行的Resize

GO TO TOP

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

[VB.NET]
禁止用戶改變DataGridView1的第一列的列寬
DataGridView1.Columns(0).Resizable = DataGridViewTriState.False

禁止用戶改變DataGridView1的第一列的行寬
DataGridView1.Rows(0).Resizable = DataGridViewTriState.False

 

[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)列寬和行高的最小值的設定

[VB.NET]
第一列的最小列寬設定爲 100
DataGridView1.Columns(0).MinimumWidth = 100

第一行的最小行高設定爲 50
DataGridView1.Rows(0).MinimumHeight = 50

 

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

//
第一行的最小行高設定爲 50
DataGridView1.Rows[0].MinimumHeight = 50;


4) 禁止用戶改變行頭的寬度以及列頭的高度

[VB.NET]
禁止用戶改變列頭的高度
DataGridView1.ColumnHeadersHeightSizeMode = _
    DataGridViewColumnHeadersHeightSizeMode.DisableResizing

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

 

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

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

 


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

GO TO TOP


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

[VB.NET]
'
設定包括Header和所有單元格的列寬自動調整
DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells

'
設定包括Header和所有單元格的行高自動調整
DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells

 

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

//
設定包括Header和所有單元格的行高自動調整
DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;


AutoSizeColumnsMode 屬性的設定值枚舉請參照 msdn DataGridViewAutoSizeRowsMode 說明。

2)指定列或行自動調整

[VB.NET]
第一列自動調整
DataGridView1.Columns(0).AutoSizeMode = _
    DataGridViewAutoSizeColumnMode.DisplayedCells

 

[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
,臨時的,讓行高自動調整

[VB.NET]
'
DataGridView1 的所有行高自動調整一下。
DataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCells)

'
DataGridView1 的第一行的行高自動調整一下。
DataGridView1.AutoResizeRow(0, DataGridViewAutoSizeRowMode.AllCells)

 

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

//
DataGridView1 的第一行的行高自動調整一下。
DataGridView1.AutoResizeRow(0, DataGridViewAutoSizeRowMode.AllCells);

上面調用的 AutoResizeRows AutoResizeRow 當指定的是DataGridViewAutoSizeRowMode.AllCells 的時候,參數可以省略。即:DataGridView1.AutoResizeRow (0) DataGridView1.AutoResizeRows()

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

[VB.NET]
'
列頭高度自動調整
DataGridView1.AutoResizeColumnHeadersHeight()

'
行頭寬度自動調整
DataGridView1.AutoResizeRowHeadersWidth( _
    DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders)

 

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

//
行頭寬度自動調整
DataGridView1.AutoResizeRowHeadersWidth(
    DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders);


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


DataGridView 凍結列或行

GO TO TOP

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

[VB.NET]
' DataGridView1
的左側2列固定
DataGridView1.Columns(1).Frozen = True

[C#]
// DataGridView1
的左側2列固定
DataGridView1.Columns[1].Frozen = true;

但是,DataGridView.AllowUserToOrderColumns = True 時,固定列不能移動到非固定列,反之亦然。

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

[VB.NET]
' DataGridView1
的上3行固定
DataGridView1.Rows(2).Frozen = True

 

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

 


DataGridView 列順序的調整

GO TO TOP

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

[VB.NET]
' DataGridView1
ColumnDisplayIndexChanged事件處理方法
Private Sub DataGridView1_ColumnDisplayIndexChanged(ByVal sender As Object, _
        ByVal e As DataGridViewColumnEventArgs) _
        Handles DataGridView1.ColumnDisplayIndexChanged
    Console.WriteLine("{0}
的位置改變到 {1} ", _
        e.Column.Name, e.Column.DisplayIndex)
End Sub

 

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

 


? DataGridView 行頭列頭的單元格

GO TO TOP

[VB.NET]
' DataGridView1
的第一列列頭內容
DataGridView1.Columns(0).HeaderCell.Value = "第一列"

' DataGridView1
的第一行行頭內容
DataGridView1.Rows(0).HeaderCell.Value = "第一行"

' DataGridView1
的左上頭部單元內容
DataGridView1.TopLeftHeaderCell.Value = "左上"

 

[C#]
//
改變DataGridView1的第一列列頭內容
DataGridView1.Columns[0].HeaderCell.Value = "第一列";

//
改變DataGridView1的第一行行頭內容
DataGridView1.Rows[0].HeaderCell.Value = "第一行";

//
改變DataGridView1的左上頭部單元內容
DataGridView1.TopLeftHeaderCell.Value = "左上";


另外你也可以通過 HeaderText 來改變他們的內容。

[VB.NET]
'
改變DataGridView1的第一列列頭內容
DataGridView1.Columns(0).HeaderText = "第一列"

 

[C#]
//
改變DataGridView1的第一列列頭內容
DataGridView1.Columns[0].HeaderText = "第一列";

 


? DataGridView 剪切板的操作

GO TO TOP

DataGridView.ClipboardCopyMode 屬性被設定爲 DataGridViewClipboardCopyMode.Disable 以外的情況時,「Ctrl + C」按下的時候,被選擇的單元格的內容會拷貝到系統剪切板內。格式有: Text UnicodeTextHtml CommaSeparatedValue。可以直接粘貼到 Excel 內。

ClipboardCopyMode 還可以設定 Header部分是否拷貝: EnableAlwaysIncludeHeaderText 拷貝Header部分、EnableWithoutHeaderText 則不拷貝。默認是 EnableWithAutoHeaderText Header 如果選擇了的話,就拷貝。

1)編程方式實現剪切板的拷貝

Clipboard.SetDataObject(DataGridView1.GetClipboardContent())

2) DataGridView
的數據粘貼

實現剪切板的拷貝比較容易,但是實現 DataGridView 的直接粘貼就比較難了。「Ctrl + V」按下進行粘貼時,DataGridView 沒有提供方法,只能自己實現。

以下,是粘貼時簡單的事例代碼,將拷貝數據粘貼到以選擇單元格開始的區域內。

[VB.NET]
'
當前單元格是否選擇的判斷
If DataGridView1.CurrentCell Is Nothing Then
    Return
End If
Dim insertRowIndex As Integer = DataGridView1.CurrentCell.RowIndex

'
獲取剪切板的內容,並按行分割
Dim pasteText As String = Clipboard.GetText()
If String.IsNullOrEmpty(pasteText) Then
    Return
End If
pasteText = pasteText.Replace(vbCrLf, vbLf)
pasteText = pasteText.Replace(vbCr, vbLf)
pasteText.TrimEnd(New Char() {vbLf})
Dim lines As String() = pasteText.Split(vbLf)

Dim isHeader As Boolean = True
For Each line As String In lines
    '
是否是列頭
    If isHeader Then
        isHeader = False
    Else
        '
Tab 分割數據
        Dim vals As String() = line.Split(ControlChars.Tab)
        '
判斷列數是否統一
        If vals.Length - 1 <> DataGridView1.ColumnCount Then
            Throw New ApplicationException("
粘貼的列數不正確。")
        End If
        Dim row As DataGridViewRow = DataGridView1.Rows(insertRowIndex)
        '
行頭設定
        row.HeaderCell.Value = vals(0)
        '
單元格內容設定
        Dim i As Integer
        For i = 0 To row.Cells.Count - 1
            row.Cells(i).Value = vals((i + 1))
        Next i

        ' DataGridView
的行索引+1
        insertRowIndex += 1
    End If
Next line

 

[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的設置

GO TO TOP

DataGridView.ShowCellToolTips = True 的情況下,單元格的 ToolTip 可以表示出來。對於單元格窄小,無法完全顯示的單元格, ToolTip 可以顯示必要的信息。

1)設定單元格的ToolTip內容

[VB.NET]
'
設定單元格的ToolTip內容
DataGridView1(0, 0).ToolTipText = "該單元格的內容不能修改"

'
設定列頭的單元格的ToolTip內容
DataGridView1.Columns(0).ToolTipText = "該列只能輸入數字"

'
設定行頭的單元格的ToolTip內容
DataGridView1.Rows(0).HeaderCell.ToolTipText = "該行單元格內容不能修改"

 

[C#]
//
設定單元格的ToolTip內容
DataGridView1[0, 0].ToolTipText = "該單元格的內容不能修改";

//
設定列頭的單元格的ToolTip內容
DataGridView1.Columns[0].ToolTipText = "該列只能輸入數字";

//
設定行頭的單元格的ToolTip內容
DataGridView1.Rows[0].HeaderCell.ToolTipText = "該行單元格內容不能修改";


2 CellToolTipTextNeeded 事件
在批量的單元格的 ToolTip 設定的時候,一個一個指定那麼設定的效率比較低,這時候可以利用 CellToolTipTextNeeded 事件。當單元格的 ToolTipText 變化的時候也會引發該事件。但是,當DataGridViewDataSource被指定且VirualMode=True的時候,該事件不會被引發。

[VB.NET]
' CellToolTipTextNeeded
事件處理方法
Private Sub DataGridView1_CellToolTipTextNeeded(ByVal sender As Object, _
        ByVal e As DataGridViewCellToolTipTextNeededEventArgs) _
        Handles DataGridView1.CellToolTipTextNeeded
    e.ToolTipText = e.ColumnIndex.ToString() + ", " + e.RowIndex.ToString()
End Sub

 

[C#]
// CellToolTipTextNeeded
事件處理方法
private void DataGridView1_CellToolTipTextNeeded(object sender,
    DataGridViewCellToolTipTextNeededEventArgs e)
{
    e.ToolTipText = e.ColumnIndex.ToString() + ", " + e.RowIndex.ToString();
}

 


? DataGridView 的右鍵菜單(ContextMenuStrip

GO TO TOP

DataGridView, DataGridViewColumn, DataGridViewRow, DataGridViewCell ContextMenuStrip 屬性。可以通過設定 ContextMenuStrip 對象來控制 DataGridView 的右鍵菜單的顯示。 DataGridViewColumn ContextMenuStrip 屬性設定了除了列頭以外的單元格的右鍵菜單。 DataGridViewRow ContextMenuStrip 屬性設定了除了行頭以外的單元格的右鍵菜單。DataGridViewCell   ContextMenuStrip 屬性設定了指定單元格的右鍵菜單。

[VB.NET]
' DataGridView
ContextMenuStrip 設定
DataGridView1.ContextMenuStrip = Me.ContextMenuStrip1

'
列的 ContextMenuStrip 設定
DataGridView1.Columns(0).ContextMenuStrip = Me.ContextMenuStrip2
'
列頭的 ContextMenuStrip 設定
DataGridView1.Columns(0).HeaderCell.ContextMenuStrip = Me.ContextMenuStrip2

'
行的 ContextMenuStrip 設定
DataGridView1.Rows(0).ContextMenuStrip = Me.ContextMenuStrip3

'
單元格的 ContextMenuStrip 設定
DataGridView1(0, 0).ContextMenuStrip = Me.ContextMenuStrip4

[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

? CellContextMenuStripNeededRowContextMenuStripNeeded 事件

利用 CellContextMenuStripNeeded 事件可以設定單元格的右鍵菜單,尤其但需要右鍵菜單根據單元格值的變化而變化的時候。比起使用循環遍歷,使用該事件來設定右鍵菜單的效率更高。但是,在DataGridView使用了DataSource綁定而且是VirtualMode的時候,該事件將不被引發。

[VB.NET]
'
 CellContextMenuStripNeeded事件處理方法
Private Sub DataGridView1_CellContextMenuStripNeeded( _
        ByVal sender As Object, _
        ByVal e As DataGridViewCellContextMenuStripNeededEventArgs) _
        Handles DataGridView1.CellContextMenuStripNeeded
    Dim dgv As DataGridView = CType(sender, DataGridView)
    If e.RowIndex < 0 Then
        '
 列頭的ContextMenuStrip設定
        e.ContextMenuStrip = Me.ContextMenuStrip1
    ElseIf e.ColumnIndex < 0 Then
        '
 行頭的ContextMenuStrip設定
        e.ContextMenuStrip = Me.ContextMenuStrip2
    ElseIf TypeOf (dgv(e.ColumnIndex, e.RowIndex).Value) Is Integer Then
        '
 如果單元格值是整數時
        e.ContextMenuStrip = Me.ContextMenuStrip3
    End If
End Sub

 

[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 事件來設定行的右鍵菜單。

[VB.NET]
'
 RowContextMenuStripNeeded事件處理方法
Private Sub DataGridView1_RowContextMenuStripNeeded( _
        ByVal sender As Object, _
        ByVal e As DataGridViewRowContextMenuStripNeededEventArgs) _
        Handles DataGridView1.RowContextMenuStripNeeded
    Dim dgv As DataGridView = CType(sender, DataGridView)
    '
 當"Column1"列是Bool型且爲True時、設定其的ContextMenuStrip
    Dim boolVal As Object = dgv("Column1", e.RowIndex).Value
    Console.WriteLine(boolVal)
    If TypeOf boolVal Is Boolean AndAlso CBool(boolVal) Then
        e.ContextMenuStrip = Me.ContextMenuStrip1
    End If
End Sub

[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 的單元格的邊框、網格線樣式的設定

GO TO TOP

1) DataGridView 的邊框線樣式的設定
DataGridView 的邊框線的樣式是通過 DataGridView.BorderStyle 屬性來設定的。 BorderStyle 屬性設定值是一個
BorderStyle 枚舉: FixedSingle(單線,默認)、Fixed3DNone

2) 單元格的邊框線樣式的設定

單元格的邊框線的樣式是通過 DataGridView.CellBorderStyle 屬性來設定的。 CellBorderStyle 屬性設定值是
DataGridViewCellBorderStyle 枚舉。(詳細參見 MSDN
另外,通過 DataGridView.ColumnHeadersBorderStyle RowHeadersBorderStyle 屬性可以修改 DataGridView 的頭部的單元格邊框線樣式。屬性設定值是 DataGridViewHeaderBorderStyle 枚舉。(詳細參見 MSDN

3)單元格的邊框顏色的設定
單元格的邊框線的顏色可以通過 DataGridView.GridColor 屬性來設定的。默認是 ControlDarkDark 。但是只有在 CellBorderStyle 被設定爲 SingleSingleHorizontalSingleVertical  的條件下才能改變其邊框線的顏色。同樣,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 單元格表示值的自定義

GO TO TOP

通過CellFormatting事件,可以自定義單元格的表示值。(比如:值爲Error的時候,單元格被設定爲紅色)
下面的示例:將“Colmn1”列的值改爲大寫。

[VB.NET]
'CellFormatting 
事件處理方法
Private Sub DataGridView1_CellFormatting(ByVal sender As Object, _
        ByVal e As DataGridViewCellFormattingEventArgs) _
        Handles DataGridView1.CellFormatting
    Dim dgv As DataGridView = CType(sender, DataGridView)

    ' 
如果單元格是“Column1”列的單元格
    If dgv.Columns(e.ColumnIndex).Name = "Column1" AndAlso _
            TypeOf e.Value Is String Then
        ' 
將單元格值改爲大寫
        Dim str As String = e.Value.ToString()
        e.Value = str.ToUpper()
        ' 
應用該FormatFormat完畢。
        e.FormattingApplied = True
    End If
End Sub

 

[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();
        //
應用該FormatFormat完畢。
        e.FormattingApplied = true;
    }
}


CellFormatting事件的DataGridViewCellFormattingEventArgs對象的Value屬性一開始保存着未被格式化的值。當Value屬性被設定表示用的文本之後,把FormattingApplied屬性做爲True,告知DataGridView文本已經格式化完畢。如果不這樣做的話,DataGridView會根據已經設定的FormatNullValueDataSourceNullValueFormatProvider屬性會將Value屬性會被重新格式化一遍。


? DataGridView 用戶輸入時,單元格輸入值的設定

GO TO TOP

通過 DataGridView.CellParsing 事件可以設定用戶輸入的值。下面的示例:當輸入英文文本內容的時候,立即被改變爲大寫。

[VB.NET]
'CellParsing
事件處理方法
Private Sub DataGridView1_CellParsing(ByVal sender As Object, _
        ByVal e As DataGridViewCellParsingEventArgs) _
        Handles DataGridView1.CellParsing
    Dim dgv As DataGridView = CType(sender, DataGridView)

    '
單元格列爲“Column1”
    If dgv.Columns(e.ColumnIndex).Name = "Column1" AndAlso _
            e.DesiredType Is GetType(String) Then
        '
將單元格值設爲大寫

//CellParsing 事件處理方法
private void DataGridView1_CellParsing(object sender,
    DataGridViewCellParsingEventArgs e)
{
    DataGridView dgv = (DataGridView)sender;

    //
單元格列爲“Column1”
    if (dgv.Columns[e.ColumnIndex].Name == "Column1" &&

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