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。

效果图如下:左边为方法一的,右边为方法二的,注意方法二的悬停是有时间限制的

   C# 鼠标悬停在datagridview的某单元格,显示悬浮框效果

说明:
对于方法一,我使用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

 不妥或欠缺之处,请指教!

你可能感兴趣的:(datagridview)