最近項目中需要增加一個新的功能,即當鼠標停在Datagridview的某一單元格時,如果該單元格的內容是需要顯示說明的,就顯示一個懸浮框對其中的數據進行解析說明,在網上查了下,主要有兩種方法:
方法一,使用一個label控件,通過設置label的visible屬性來進行顯示和隱藏;
方法二,使用datagridview的ToolTipText屬性。
以下是我用於測試的代碼:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace zhen_DGV 11 { 12 public partial class Form1 : Form 13 { 14 public Form1() 15 { 16 InitializeComponent(); 17 18 //Creat a DataTable 19 DataTable dt = new DataTable("table1"); 20 21 //Add columns for DataTable 22 dt.Columns.Add("ID"); 23 dt.Columns.Add("Name"); 24 dt.Columns.Add("Age"); 25 26 DataColumn dc = new DataColumn("Sex"); 27 dt.Columns.Add(dc); 28 29 ///Add rows for DataTable 30 //Initialize the row 31 DataRow dr = dt.NewRow(); 32 dr["ID"] = "563"; 33 dr["Name"] = "545"; 34 dt.Rows.Add(dr); 35 36 DataRow drr = dt.NewRow(); 37 object[] objs = { 144, "QQ" }; 38 drr.ItemArray = objs; 39 dt.Rows.Add(drr); 40 41 dataGridView1.DataSource = dt; 42 DataRow drrr = dt.NewRow(); //Add new row 43 dt.Rows.Add(drrr); 44 } 45 46 private void dataGridView1_MouseMove(object sender, MouseEventArgs e) 47 { 48 label2.Location = new Point(e.X + 20, e.Y + 100); 49 } 50 51 private void dataGridView1_CellMouseEnter(object sender, DataGridViewCellEventArgs e) 52 { 53 if (e.ColumnIndex < 0 || e.RowIndex < 0) 54 { 55 label2.Visible = false; 56 return; 57 } 58 else 59 { 60 if ((dataGridView1[0 ,e.RowIndex].Value.ToString() == "144") && (e.ColumnIndex == 1)) 61 //if (dataGridView1[e.ColumnIndex,e.RowIndex].Value.ToString() == "QQ")//this way is OK 62 { 63 dataGridView1[e.ColumnIndex, e.RowIndex].ToolTipText = "QQ:563144545";//method one 64 label2.Text ="QQ:563144545";//method two 65 timer1.Enabled = true; 66 } 67 else 68 { 69 label2.Visible = false; 70 timer1.Enabled = false; 71 } 72 } 73 } 74 75 private void timer1_Tick(object sender, EventArgs e) 76 { 77 label2.Visible = true; 78 } 79 } 80 }
但在測試的過程中發現,如果列表中有新的新行顯示的話,鼠標移動到新行會出現異常“未將對象引用設置到對象的實例。”。調試時發現是
dataGridView1[0,e.RowIndex].Value = null引起的,目前還沒有找到解決的辦法,所以我在使用時時不顯示新行的,即設置
datagridview.AllowUserToAddRows = false。
效果圖如下:左邊為方法一的,右邊為方法二的,注意方法二的懸停是有時間限制的

說明:
對於方法一,我使用dataGridView1_MouseMove(object sender, MouseEventArgs e)方法來定位label的顯示坐標,使用timer1來延遲label的顯示。
在兩種方法中都是用了dataGridView1_CellMouseEnter(object sender, DataGridViewCellEventArgs e)方法對鼠標所在單元格的內容進行讀取判斷。
參考內容:
http://wenwen.soso.com/z/q312200791.htm?sp=4001
http://zhidao.baidu.com/question/305382667.html
不妥或欠缺之處,請指教!
