好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

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

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

 

 

标签:  C# ,  datagridview

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于C# 鼠标悬停在datagridview的某单元格,显示悬浮框效果的详细内容...

  阅读:55次