zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Redis 主从复制
    LESSON THREE
    SSIS OLEDB COMMAND RULES
    Hadoop step by step _ install and configuration environment
    repcached的安装练习
    Check list
    简单对象定位——xpath定位
    简单对象定位
    Python webdriver API- 浏览器的操作
    第一个自动化脚本示例
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2546741.html
Copyright © 2011-2022 走看看