C# 鼠標懸停在datagridview的某單元格,顯示懸浮框效果


最近項目中需要增加一個新的功能,即當鼠標停在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

 不妥或欠缺之處,請指教!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM