




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、基于C#的WinForm中DataGridView控件操作匯總一、單元格內(nèi)容的操作 */ 取得當(dāng)前單元格內(nèi)容 Console.WriteLine(DataGridView1.CurrentCell.Value); / 取得當(dāng)前單元格的列 Index Console.WriteLine(DataGridView1.CurrentCell.ColumnIndex); / 取得當(dāng)前單元格的行 Index Console.WriteLine(DataGridView1.CurrentCell.RowIndex);*另外,使用 DataGridView.CurrentCellAddress 屬性(而不是
2、直接訪問單元格)來確定單元格所在的行:DataGridView.CurrentCellAddress.Y 和列: DataGridView.CurrentCellAddress.X 。這對于避免取消共享行的共享非常有用。 當(dāng)前的單元格可以通過設(shè)定 DataGridView 對象的 CurrentCell 來改變??梢酝ㄟ^ CurrentCell 來設(shè)定 DataGridView 的激活單元格。將 CurrentCell 設(shè)為 Nothing(null) 可以取消激活的單元格。/ 設(shè)定 (0, 0) 為當(dāng)前單元格 DataGridView1.CurrentCell = DataGridView1
3、0, 0; 在整行選中模式開啟時,你也可以通過 CurrentCell 來設(shè)定選定行。 / / 向下遍歷 / / / 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.dataGridView10, row; / / 向上遍歷 / / / private v
4、oid 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.dataGridView10, row; * 注意: this.dataGridView 的索引器的參數(shù)是: columnIndex, rowIndex 或是 columnName, rowIndex 這與習(xí)慣不同。*Data
5、GridView 設(shè)定單元格只讀:1) 使用 ReadOnly 屬性 ?如果希望,DataGridView 內(nèi)所有單元格都不可編輯, 那么只要: / 設(shè)置 DataGridView1 為只讀 DataGridView1.ReadOnly = true;此時,用戶的新增行操作和刪除行操作也被屏蔽了。 *如果希望,DataGridView 內(nèi)某個單元格不可編輯, 那么只要: / 設(shè)置 DataGridView1 的第2列整列單元格為只讀 DataGridView1.Columns1.ReadOnly = true; / 設(shè)置 DataGridView1 的第3行整行單元格為只讀 DataGridV
6、iew1.Rows2.ReadOnly = true; / 設(shè)置 DataGridView1 的0,0單元格為只讀 DataGridView10, 0.ReadOnly = true; *DataGridView 行頭列頭的單元格/ 改變DataGridView1的第一列列頭內(nèi)容 DataGridView1.Columns0.HeaderCell.Value = 第一列; / 改變DataGridView1的第一行行頭內(nèi)容 DataGridView1.Rows0.HeaderCell.Value = 第一行; / 改變DataGridView1的左上頭部單元內(nèi)容 DataGridView1.T
7、opLeftHeaderCell.Value = 左上; 另外你也可以通過 HeaderText 來改變他們的內(nèi)容。/ 改變DataGridView1的第一列列頭內(nèi)容 DataGridView1.Columns0.HeaderText = 第一列; * DataGridView 單元格的ToolTip的設(shè)置 DataGridView.ShowCellToolTips = True 的情況下, 單元格的 ToolTip 可以表示出來。對于單元格窄小,無法完全顯示的單元格, ToolTip 可以顯示必要的信息。 1) 設(shè)定單元格的ToolTip內(nèi)容 / 設(shè)定單元格的ToolTip內(nèi)容 DataGr
8、idView10, 0.ToolTipText = 該單元格的內(nèi)容不能修改; / 設(shè)定列頭的單元格的ToolTip內(nèi)容 DataGridView1.Columns0.ToolTipText = 該列只能輸入數(shù)字; / 設(shè)定行頭的單元格的ToolTip內(nèi)容 DataGridView1.Rows0.HeaderCell.ToolTipText = 該行單元格內(nèi)容不能修改; 2) CellToolTipTextNeeded 事件 在批量的單元格的 ToolTip 設(shè)定的時候,一個一個指定那么設(shè)定的效率比較低, 這時候可以利用 CellToolTipTextNeeded 事件。當(dāng)單元格的 ToolTi
9、pText 變化的時候也會引發(fā)該事件。但是,當(dāng)DataGridView的DataSource被指定且VirualMode=True的時候,該事件不會被引發(fā)。 / CellToolTipTextNeeded事件處理方法 private void DataGridView1_CellToolTipTextNeeded(object sender, DataGridViewCellToolTipTextNeededEventArgs e) e.ToolTipText = e.ColumnIndex.ToString() + , + e.RowIndex.ToString(); *DataGridVi
10、ew 的單元格的邊框、 網(wǎng)格線樣式的設(shè)定 1) DataGridView 的邊框線樣式的設(shè)定 DataGridView 的邊框線的樣式是通過 DataGridView.BorderStyle 屬性來設(shè)定的。 BorderStyle 屬性設(shè)定值是一個 BorderStyle 枚舉: FixedSingle(單線,默認)、Fixed3D、None。 2) 單元格的邊框線樣式的設(shè)定 單元格的邊框線的樣式是通過 DataGridView.CellBorderStyle 屬性來設(shè)定的。 CellBorderStyle 屬性設(shè)定值是 DataGridViewCellBorderStyle 枚舉。(詳細參見
11、 MSDN) 另外,通過 DataGridView.ColumnHeadersBorderStyle 和 RowHeadersBorderStyle 屬性可以修改 DataGridView 的頭部的單元格邊框線樣式。 屬性設(shè)定值是 DataGridViewHeaderBorderStyle 枚舉。(詳細參見 MSDN) 3) 單元格的邊框顏色的設(shè)定 單元格的邊框線的顏色可以通過 DataGridView.GridColor 屬性來設(shè)定的。默認是 ControlDarkDark 。但是只有在 CellBorderStyle 被設(shè)定為 Single、SingleHorizontal、SingleV
12、ertical 的條件下才能改變其邊框線的顏色。同樣,ColumnHeadersBorderStyle 以及 RowHeadersBorderStyle 只有在被設(shè)定為 Single 時,才能改變顏色。 4) 單元格的上下左右的邊框線式樣的單獨設(shè)定 CellBorderStyle只能設(shè)定單元格全部邊框線的式樣。要單獨改變單元格某一邊邊框式樣的話,需要用到DataGridView.AdvancedCellBorderStyle屬性。如示例: 單元格的上邊和左邊線設(shè)為二重線 單元格的下邊和右邊線設(shè)為單重線 DataGridView1.AdvancedCellBorderStyle.Top = _
13、DataGridViewAdvancedCellBorderStyle.InsetDouble DataGridView1.AdvancedCellBorderStyle.Right = _ DataGridViewAdvancedCellBorderStyle.Inset DataGridView1.AdvancedCellBorderStyle.Bottom = _ DataGridViewAdvancedCellBorderStyle.Inset DataGridView1.AdvancedCellBorderStyle.Left = _ DataGridViewAdvancedCell
14、BorderStyle.InsetDouble 同樣,設(shè)定行頭單元格的屬性是: AdvancedRowHeadersBorderStyle, 設(shè)定列頭單元格屬性是:AdvancedColumnHeadersBorderStyle。*DataGridView 單元格表示值的自定義 通過CellFormatting事件,可以自定義單元格的表示值。(比如:值為Error的時候,單元格被設(shè)定為紅色) 下面的示例:將“Colmn1”列的值改為大寫。 /CellFormatting 事件處理方法 private void DataGridView1_CellFormatting(object sender
15、, DataGridViewCellFormattingEventArgs e) DataGridView dgv = (DataGridView)sender; / 如果單元格是“Column1”列的單元格 if (dgv.Columnse.ColumnIndex.Name = Column1 & e.Value is string) / 將單元格值改為大寫 string str = e.Value.ToString(); e.Value = str.ToUpper(); / 應(yīng)用該Format,F(xiàn)ormat完畢。 e.FormattingApplied = true; CellFormat
16、ting 事件的DataGridViewCellFormattingEventArgs對象的Value屬性一開始保存著未被格式化的值。當(dāng)Value屬性被設(shè)定表示用的文本之后,把FormattingApplied屬性做為True,告知DataGridView文本已經(jīng)格式化完畢。如果不這樣做的話,DataGridView會根據(jù)已經(jīng)設(shè)定的 Format,NullValue,DataSourceNullValue,F(xiàn)ormatProvider屬性會將Value屬性會被重新格式化一遍。*DataGridView 用戶輸入時,單元格輸入值的設(shè)定 通過 DataGridView.CellParsing 事件
17、可以設(shè)定用戶輸入的值。下面的示例:當(dāng)輸入英文文本內(nèi)容的時候,立即被改變?yōu)榇髮憽?CellParsing 事件處理方法 private void DataGridView1_CellParsing(object sender, DataGridViewCellParsingEventArgs e) DataGridView dgv = (DataGridView)sender; /單元格列為“Column1”時 if (dgv.Columnse.ColumnIndex.Name = Column1 & e.DesiredType = typeof(string) /將單元格值設(shè)為大寫 e.Val
18、ue = e.Value.ToString().ToUpper(); /解析完畢 e.ParsingApplied = true; 二 、行/列的操作 * DataGridView 不顯示最下面的新行: 通常 DataGridView 的最下面一行是用戶新追加的行(行頭顯示 * )。如果不想讓用戶新追加行即不想顯示該新行,可以將 DataGridView 對象的 AllowUserToAddRows 屬性設(shè)置為 False。 / 設(shè)置用戶不能手動給 DataGridView1 添加新行 DataGridView1.AllowUserToAddRows = false; 但是,可以通過程序: D
19、ataGridViewRowCollection.Add 為 DataGridView 追加新行。 補足: 如果 DataGridView 的 DataSource 綁定的是 DataView, 還可以通過設(shè)置 DataView.AllowAdd 屬性為 False 來達到同樣的效果。*DataGridView 判斷新增行: DataGridView的AllowUserToAddRows屬性為True時也就是允許用戶追加新行的場合下,DataGridView的最后一行就是新追加的行(*行)。使用 DataGridViewRow.IsNewRow 屬性可以判斷哪一行是新追加的行。另外,通過Dat
20、aGridView.NewRowIndex 可以獲取新行的行序列號。在沒有新行的時候,NewRowIndex = -1。 If (DataGridView1.CurrentRow.IsNewRow) Console.WriteLine(當(dāng)前行為新追加行。) ;Else Console.WriteLine(當(dāng)前行不是新追加行。) ;*DataGridView 行的用戶刪除操作的自定義: 1) 無條件的限制行刪除操作。 默認時,DataGridView 是允許用戶進行行的刪除操作的。如果設(shè)置 DataGridView對象的AllowUserToDeleteRows屬性為 False 時, 用戶的行
21、刪除操作就被禁止了。 / 禁止DataGridView1的行刪除操作。 DataGridView1.AllowUserToDeleteRows = false; 但是,通過 DataGridViewRowCollection.Remove 還是可以進行行的刪除。 補足: 如果 DataGridView 綁定的是 DataView 的話,通過 DataView.AllowDelete 也可以控制行的刪除。 *行刪除時的條件判斷處理。 用戶在刪除行的時候,將會引發(fā) DataGridView.UserDeletingRow 事件。 在這個事件里,可以判斷條件并取消刪除操作。 / DataGridVi
22、ew1 的 UserDeletingRow 事件 private void DataGridView1_UserDeletingRow( object sender, DataGridViewRowCancelEventArgs e) / 刪除前的用戶確認。 if (MessageBox.Show(確認要刪除該行數(shù)據(jù)嗎?, 刪除確認, MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK) / 如果不是 OK,則取消。 e.Cancel = true; *DataGridView 行、列的隱藏和刪除: 1
23、) 行、列的隱藏 / DataGridView1的第一列隱藏 DataGridView1.Columns0.Visible = false; / DataGridView1的第一行隱藏 DataGridView1.Rows0.Visible = false; 2) 行頭、列頭的隱藏 / 列頭隱藏 DataGridView1.ColumnHeadersVisible = false; / 行頭隱藏 DataGridView1.RowHeadersVisible = false; 3) 行和列的刪除 刪除名為Column1的列 DataGridView1.Columns.Remove(Column
24、1); 刪除第一列 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.AllowUserTo
25、ResizeColumns = false; /禁止用戶改變DataGridView1所有行的行高 DataGridView1.AllowUserToResizeRows = false; 但是可以通過 DataGridViewColumn.Width 或者 DataGridViewRow.Height 屬性設(shè)定列寬和行高。 *2) 禁止指定行或者列的Resize / 禁止用戶改變DataGridView1的第一列的列寬 DataGridView1.Columns0.Resizable = DataGridViewTriState.False; / 禁止用戶改變DataGridView1的第一
26、列的行寬 DataGridView1.Rows0.Resizable = DataGridViewTriState.False; 關(guān)于 NoSet 當(dāng) Resizable 屬性設(shè)為 DataGridViewTriState.NotSet 時, 實際上會默認以 DataGridView 的 AllowUserToResizeColumns 和 AllowUserToResizeRows 的屬性值進行設(shè)定。比如: DataGridView.AllowUserToResizeColumns = False 且 Resizable 是 NoSet 設(shè)定時,Resizable = False 。 判斷
27、Resizable 是否是繼承設(shè)定了 DataGridView 的 AllowUserToResizeColumns 和 AllowUserToResizeRows 的屬性值, 可以根據(jù) State 屬性判斷。如果 State 屬性含有 ResizableSet,那么說明沒有繼承設(shè)定。 3) 列寬和行高的最小值的設(shè)定 / 第一列的最小列寬設(shè)定為 100 DataGridView1.Columns0.MinimumWidth = 100; / 第一行的最小行高設(shè)定為 50 DataGridView1.Rows0.MinimumHeight = 50; 4) 禁止用戶改變行頭的寬度以及列頭的高度
28、/ 禁止用戶改變列頭的高度 DataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing; / 禁止用戶改變行頭的寬度 DataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.EnableResizing; *DataGridView 列寬和行高自動調(diào)整的設(shè)定:/ 設(shè)定包括Header和所有單元格的列寬自動調(diào)整 DataGridView1.AutoSizeColu
29、mnsMode = DataGridViewAutoSizeColumnsMode.AllCells; / 設(shè)定包括Header和所有單元格的行高自動調(diào)整 DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells; AutoSizeColumnsMode 屬性的設(shè)定值枚舉請參照 msdn 的 DataGridViewAutoSizeRowsMode 說明。 2)指定列或行自動調(diào)整 / 第一列自動調(diào)整 DataGridView1.Columns0.AutoSizeMode =DataGridViewAutoSiz
30、eColumnMode.DisplayedCells; AutoSizeMode 設(shè)定為 NotSet 時, 默認繼承的是 DataGridView.AutoSizeColumnsMode 屬性。 3) 設(shè)定列頭的高度和行頭的寬度自動調(diào)整 / 設(shè)定列頭的寬度可以自由調(diào)整 DataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; / 設(shè)定行頭的寬度可以自由調(diào)整 DataGridView1.RowHeadersWidthSizeMode = DataGridViewRo
31、wHeadersWidthSizeMode.AutoSizeToAllHeaders; 4) 隨時自動調(diào)整 a, 臨時的,讓列寬自動調(diào)整,這和指定AutoSizeColumnsMode屬性一樣。 / 讓 DataGridView1 的所有列寬自動調(diào)整一下。 DataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells); / 讓 DataGridView1 的第一列的列寬自動調(diào)整一下。 DataGridView1.AutoResizeColumn(0, DataGridViewAutoSizeColumnMod
32、e.AllCells);上面調(diào)用的 AutoResizeColumns 和 AutoResizeColumn 當(dāng)指定的是DataGridViewAutoSizeColumnMode.AllCells 的時候,參數(shù)可以省略。即: DataGridView1.AutoResizeColumn(0) 和 DataGridView1.AutoResizeColumns() b,臨時的,讓行高自動調(diào)整 / 讓 DataGridView1 的所有行高自動調(diào)整一下。 DataGridView1.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCells); /讓
33、 DataGridView1 的第一行的行高自動調(diào)整一下。 DataGridView1.AutoResizeRow(0, DataGridViewAutoSizeRowMode.AllCells);上面調(diào)用的 AutoResizeRows 和 AutoResizeRow 當(dāng)指定的是DataGridViewAutoSizeRowMode.AllCells 的時候,參數(shù)可以省略。即:DataGridView1.AutoResizeRow (0) 和 DataGridView1.AutoResizeRows() c,臨時的,讓行頭和列頭自動調(diào)整 / 列頭高度自動調(diào)整 DataGridView1.Au
34、toResizeColumnHeadersHeight(); / 行頭寬度自動調(diào)整 DataGridView1.AutoResizeRowHeadersWidth( DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders); 關(guān)于性能: 通過 AutoSizeColumnsMode 或者 AutoSizeRowsMode 屬性所指定的單元格進行自動調(diào)整時,如果調(diào)整次數(shù)過于多那么將可能導(dǎo)致性能下降,尤其是在行和列數(shù)比較多的情況下。在這時用 DisplayedCells 代替 AllCells 能減少非所見的單元格的調(diào)整,從而提高性能。 *
35、DataGridView 凍結(jié)列或行1) 列凍結(jié) DataGridViewColumn.Frozen 屬性為 True 時, 該列左側(cè)的所有列被固定, 橫向滾動時固定列不隨滾動條滾動而左右移動。這對于重要列固定顯示很有用。/ DataGridView1的左側(cè)2列固定 DataGridView1.Columns1.Frozen = true; 但是,DataGridView.AllowUserToOrderColumns = True 時,固定列不能移動到非固定列, 反之亦然。 2) 行凍結(jié) DataGridViewRow.Frozen 屬性為 True 時, 該行上面的所有行被固定, 縱向滾動
36、時固定行不隨滾動條滾動而上下移動。/ DataGridView1 的上3行固定 DataGridView1.Rows2.Frozen = true;*DataGridView 列順序的調(diào)整設(shè)定 DataGridView 的 AllowUserToOrderColumns 為 True 的時候, 用戶可以自由調(diào)整列的順序。 當(dāng)用戶改變列的順序的時候,其本身的 Index 不會改變,但是 DisplayIndex 改變了。你也可以通過程序改變 DisplayIndex 來改變列的順序。 列順序發(fā)生改變時會引發(fā) ColumnDisplayIndexChanged 事件: / DataGridView
37、1的ColumnDisplayIndexChanged事件處理方法 private void DataGridView1_ColumnDisplayIndexChanged(object sender, DataGridViewColumnEventArgs e) Console.WriteLine(0 的位置改變到 1 , e.Column.Name, e.Column.DisplayIndex); *DataGridView 新加行的默認值的設(shè)定 需要指定新加行的默認值的時候,可以在DataGridView.DefaultValuesNeeded事件里處理。在該事件中處理除了可以設(shè)定默認值
38、以外,還可以指定某些特定的單元格的ReadOnly屬性等。/ DefaultValuesNeeded 事件處理方法 private void DataGridView1_DefaultValuesNeeded(object sender, DataGridViewRowEventArgs e) / 設(shè)定單元格的默認值 e.Row.CellsColumn1.Value = 0; e.Row.CellsColumn2.Value = -; 三、針對datagridview全局屬性的設(shè)置 * 使用 EditMode 屬性 DataGridView.EditMode 屬性被設(shè)置為 DataGridVi
39、ewEditMode.EditProgrammatically 時,用戶就不能手動編輯單元格的內(nèi)容了。但是可以通過程序,調(diào)用 DataGridView.BeginEdit 方法,使單元格進入編輯模式進行編輯。 DataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically; *根據(jù)條件設(shè)定單元格的不可編輯狀態(tài) 當(dāng)一個一個的通過單元格坐標(biāo)設(shè)定單元格 ReadOnly 屬性的方法太麻煩的時候,你可以通過 CellBeginEdit 事件來取消單元格的編輯。*/ CellBeginEdit 事件處理方法 private void
40、DataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) DataGridView dgv = (DataGridView)sender; /是否可以進行編輯的條件檢查 if (dgv.Columnse.ColumnIndex.Name = Column1 & !(bool)dgvColumn2, e.RowIndex.Value) / 取消編輯 e.Cancel = true; *DataGridView 剪切板的操作 DataGridView.ClipboardCopyMode 屬性被設(shè)定為
41、DataGridViewClipboardCopyMode.Disable 以外的情況時,Ctrl + C按下的時候,被選擇的單元格的內(nèi)容會拷貝到系統(tǒng)剪切板內(nèi)。格式有: Text, UnicodeText,Html, CommaSeparatedValue??梢灾苯诱迟N到 Excel 內(nèi)。 ClipboardCopyMode 還可以設(shè)定 Header部分是否拷貝: EnableAlwaysIncludeHeaderText 拷貝Header部分、EnableWithoutHeaderText 則不拷貝。默認是 EnableWithAutoHeaderText , Header 如果選擇了的話,
42、就拷貝。 1) 編程方式實現(xiàn)剪切板的拷貝 Clipboard.SetDataObject(DataGridView1.GetClipboardContent() 2) DataGridView 的數(shù)據(jù)粘貼 實現(xiàn)剪切板的拷貝比較容易,但是實現(xiàn) DataGridView 的直接粘貼就比較難了。Ctrl + V按下進行粘貼時,DataGridView 沒有提供方法,只能自己實現(xiàn)。 以下,是粘貼時簡單的事例代碼,將拷貝數(shù)據(jù)粘貼到以選擇單元格開始的區(qū)域內(nèi)。/當(dāng)前單元格是否選擇的判斷 if (DataGridView1.CurrentCell = null) return; int insertRowIn
43、dex = DataGridView1.CurrentCell.RowIndex; / 獲取剪切板的內(nèi)容,并按行分割 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
44、; foreach (string line in lines) / 是否是列頭 if (isHeader) isHeader = false; continue; / 按 Tab 分割數(shù)據(jù) string vals = line.Split( ); / 判斷列數(shù)是否統(tǒng)一 if (vals.Length - 1 != DataGridView1.ColumnCount) throw new ApplicationException(粘貼的列數(shù)不正確。); DataGridViewRow row = DataGridView1.RowsinsertRowIndex; / 行頭設(shè)定 row.Head
45、erCell.Value = vals0; / 單元格內(nèi)容設(shè)定 for (int i = 0; i Row Column DataGridView *CellContextMenuStripNeeded、RowContextMenuStripNeeded事件 利用CellContextMenuStripNeeded事件可以設(shè)定單元格的右鍵菜單,尤其但需要右鍵菜單根據(jù)單元格值的變化而變化的時候。比起使用循環(huán)遍歷,使用該事件來設(shè)定右鍵菜單的效率更高。但是,在DataGridView使用了DataSource綁定而且是 VirtualMode的時候,該事件將不被引發(fā)。 /CellContextMen
46、uStripNeeded事件處理方法 private void DataGridView1_CellContextMenuStripNeeded(object sender, DataGridViewCellContextMenuStripNeededEventArgs e) DataGridView dgv = (DataGridView)sender; if (e.RowIndex 0) /列頭的ContextMenuStrip設(shè)定 e.ContextMenuStrip = this.ContextMenuStrip1; else if (e.ColumnIndex 0) /行頭的Cont
47、extMenuStrip設(shè)定 e.ContextMenuStrip = this.ContextMenuStrip2; else if (dgve.ColumnIndex, e.RowIndex.Value is int) /如果單元格值是整數(shù)時 e.ContextMenuStrip = this.ContextMenuStrip3; 同樣,可以通過RowContextMenuStripNeeded事件來設(shè)定行的右鍵菜單。/RowContextMenuStripNeeded事件處理方法 private void DataGridView1_RowContextMenuStripNeeded(o
48、bject sender, DataGridViewRowContextMenuStripNeededEventArgs e) DataGridView dgv = (DataGridView)sender; /當(dāng)Column1列是Bool型且為True時、設(shè)定其的ContextMenuStrip object boolVal = dgvColumn1, e.RowIndex.Value; Console.WriteLine(boolVal); if (boolVal is bool & (bool)boolVal) e.ContextMenuStrip = this.ContextMenuS
49、trip1; CellContextMenuStripNeeded 事件處理方法的參數(shù)中、e.ColumnIndex=-1表示行頭、e.RowIndex=-1表示列頭。 RowContextMenuStripNeeded則不存在e.RowIndex=-1的情況。四、針對觸發(fā)事件的一些介紹 我認為只要記住常用的即可,比如鼠標(biāo)的操作,一些常見的點擊觸發(fā)事件;比如_CellParsing()一般在編輯狀態(tài)結(jié)束的時候發(fā)生。其他的用到的時候算查即可,時間長了掌握的也就多了。本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:/nnsword/archive/2009/12/16/5020088.aspx附錄資料:不需
50、要的可以自行刪除C語言編譯環(huán)境中的調(diào)試功能及常見錯誤提示調(diào)試功能1常用健 : 激活系統(tǒng)菜單: 將光標(biāo)在編輯窗口和、信息窗口之間切換: 加載一個文件+: 查看程序運行結(jié)果: 得到有關(guān)編輯器在線幫助+: 得到有關(guān)C語言的在線幫助+: 終止正在運行的程序2塊操作 KB: 定義塊首 KK: 定義塊尾 KV: 塊移動 KC: 塊復(fù)制 KY: 塊刪除 KH: 取消塊定義3查找、替換和刪除操作 QF: 查找字符串 QA: 查找并替換字符串 Option: G(全程), B(向文件頭), N(直接替換) Y : 刪除一行 QY: 刪除從光標(biāo)位置到行末的所有字符編譯中的常見錯誤例析(1)警告類錯誤 XXXdec
51、lare but never used 變量XXX已定義但從未用過。 XXXis assigned a value which is never used 變量XXX已賦值但從未用過。 Code has no effect 程序中含有沒有實際作用的代碼。 Non-portable pointer conversion 不適當(dāng)?shù)闹羔樲D(zhuǎn)換,可能是在應(yīng)該使用指針的地方用了一個非0的數(shù)值。 Possible use of XXXbefore definition 表達式中使用了未賦值的變量 Redeclaration of main 一個程序文件中主函數(shù)main不止一個。 Suspicious poi
52、nter conversion 可疑的指針轉(zhuǎn)換。通常是使用了基本類型不匹配的指針。 Unreachable code 程序含有不能執(zhí)行到的代碼。(2)錯誤或致命錯誤 Compound statement missing in function main 程序結(jié)尾缺少括號。 “”expected; “(”expected等 復(fù)合語句或數(shù)組初始化的結(jié)尾缺少“)”;“(”。 Case outside of switch case 不屬于Switch結(jié)構(gòu),多由于switch結(jié)構(gòu)中的花括號不配對所致。 Case statement missing : switch結(jié)構(gòu)中的某個case之后缺少冒號。 Co
53、nstant expression required 定義數(shù)組時指定的數(shù)組長度不是常量表達式。 Declaration syntax error 結(jié)構(gòu)體或聯(lián)合類型的定義后缺少分號。 Declaration was expected 缺少說明,通常是因為缺少分界符如逗號、分號、右圓括號等所引起的。 Default outside switch Default部分放到了switch結(jié)構(gòu)之外,一般是因為花括號不匹配而引起的。 do statement must have while do語句中缺少相應(yīng)的while部分。 Expression syntax 表達式語法錯。如表達式中含有兩個連續(xù)的運算符
54、 Extra parameter in call fun 調(diào)用函數(shù)fun時給出了多余的實參。 Function should return a value 函數(shù)應(yīng)該返回一個值,否則與定義時的說明類型不匹配。 Illegal use of pointer 指針被非法引用,一般是使用了非法的指針運算。 Invalid pointer addition 指針相加非法。一個指針(地址)可以和一個整數(shù)相加,但兩個指針不能相加。 Lvalue required 賦值運算的左邊是不能尋址的表達式。 Misplaced else 程序遇到了沒有配對的else No matching 表達式中的括號不配對。 P
55、ointer required on left side of_ 在“_”運算的左邊只能允許一個指針而不能是一個一般的結(jié)構(gòu)體變量或聯(lián)合類型的變量。 Statement missing; 程序遇到了后面沒有分號的語句。 Too few parameters in call 調(diào)用某個函數(shù)時實參數(shù)目不夠。 Unable to open include file XXXXXXXXXXX 頭文件找不到。 Unexpected 或:或 在不希望的地方使用了或:。 Undefined symbol Xin function fun 函數(shù)fun中的變量X沒有定義。5.連接中的常見錯誤主要錯誤類似于“undef
56、ined symbol _print in modula xxx”(print沒有定義),通常是函數(shù)名書寫錯誤。6.運行中的常見錯誤Abnormal program termination 程序異常終止。通常是由于內(nèi)存使用不當(dāng)所致。Floating point error : Domain 或Divide by 0 運算結(jié)果不是一個數(shù)或被0 除Null pointer assignment 對未初始化的指針賦值,程序有嚴重錯誤。User break 在運行程序時終止。7.程序的跟蹤調(diào)試利用Run菜單可以進行程序的跟蹤調(diào)試(1)GO to Cursor ()選擇該選項使程序執(zhí)行到光標(biāo)所在行首先將
57、光標(biāo)移到某行(一般為可執(zhí)行),選擇該功能項,則程序執(zhí)行到該行的前一行暫停。此時程序處于跟蹤調(diào)試狀態(tài),并有亮條顯示在暫停處,此時可以查詢變量或表達式的值。(2)Trace into ()執(zhí)行一條語句或一行暫停此時程序處于跟蹤調(diào)試狀態(tài),并有亮條顯示在暫停處。該選項可跟蹤到被調(diào)函數(shù)的內(nèi)部。(3)Step over ()執(zhí)行一條語句或一行暫停此時程序處于跟蹤調(diào)試狀態(tài),并有亮條顯示在暫停處。該選項將自定義函數(shù)當(dāng)作一個語句執(zhí)行,不跟蹤到函程序的內(nèi)部。(4)Debug 菜單程序處于跟蹤狀態(tài)時,可使用該菜單的選項。其主要是使用Evaluate目的是查詢或更新變量或表達式的值。選擇Evaluate功能后,系統(tǒng)彈
58、出一個對話框。該對話框包含三個選項區(qū)域:Evaluate域可以輸入一個含有目前代碼中(程序暫停區(qū)的作用域)正在使用的變量名、或含變量的表達式、或常量表達式。按回車鍵后,在Result域中顯示變量或表達式的值。還可以用New value域進行調(diào)試。如果調(diào)試程序時發(fā)現(xiàn)Result域顯示的某變量或表達式的值不正確,并能估計出該變量或表達式的值,則可以將該值輸入到New value域,繼續(xù)執(zhí)行程序,其目的是肯定錯誤發(fā)生處是否在當(dāng)前位置之前。如果輸入這個正確的值并將程序繼續(xù)執(zhí)行完畢而結(jié)果正確,說明在目前暫停處之前已經(jīng)發(fā)生錯誤而之后無錯誤。(5)Break/Watch用于設(shè)置斷點和監(jiān)視表達式。選擇Add
59、Watch功能選項,系統(tǒng)將彈出一個菜單,在Add Watch框中輸入變量名或表達式,按回車鍵后,系統(tǒng)在屏幕底部開辟一個窗口并顯示 該變量或表達式的值。【常見錯誤信息語句索引】Ambiguous operators need parentheses:不明確的運算需要用括號括起 Ambiguous symbol xxx :不明確的符號 Argument list syntax error:參數(shù)表語法錯誤 Array bounds missing in function main 缺少數(shù)組界限符 Array bounds missing :丟失數(shù)組界限符 Array size too large :
60、數(shù)組尺寸太大 Bad character in paramenters :參數(shù)中有不適當(dāng)?shù)淖址?Bad file name format in include directive :包含命令中文件名格式不正確 Bad ifdef directive synatax :編譯預(yù)處理ifdef有語法錯 Bad undef directive syntax :編譯預(yù)處理undef有語法錯 Bit field too large :位字段太長 Call of non-function :調(diào)用未定義的函數(shù) Call to function with no prototype :調(diào)用函數(shù)時沒有函數(shù)的說明 C
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 珠寶營銷合同范本
- 磁頭在辦公自動化中的角色與市場推廣
- 2025至2030年中國流水陶藝數(shù)據(jù)監(jiān)測研究報告
- 拆除商鋪合同范本
- 出資協(xié)議履約金條款
- 2024年濰坊昌邑市招聘事業(yè)單位考試真題
- 科技農(nóng)業(yè)大豆種植技術(shù)的創(chuàng)新實踐
- 社交媒體對青少年心理健康的影響及應(yīng)對策略研究報告
- 2024年贛市機關(guān)事務(wù)管理中心招聘制工作人員考試真題
- 2024年佛山市南海區(qū)官窯中心小學(xué)教師招聘考試真題
- 三年級下冊小學(xué)科學(xué)活動手冊答案
- 國家電網(wǎng)有限公司十八項電網(wǎng)重大反事故措施(修訂版)
- 環(huán)氧乙烷固定床反應(yīng)器課程設(shè)計
- 班、團、隊一體化建設(shè)實施方案
- 如何建構(gòu)結(jié)構(gòu)性思維 課后測試
- 最全的人教初中數(shù)學(xué)常用概念、公式和定理
- 橋面結(jié)構(gòu)現(xiàn)澆部分施工方案
- 開網(wǎng)店全部流程PPT課件
- 人教部編版四年級語文下冊《第1課 古詩詞三首》教學(xué)課件PPT小學(xué)優(yōu)秀公開課
- 模具數(shù)控加工技術(shù)概述
- 配電網(wǎng)工程典型設(shè)計10kV電纜分冊
評論
0/150
提交評論