RowStateChanged 的问题

RowStateChanged事件,也就是行状态发生变化时触发的事件,这个事件无法实现行号变化而触发这个要求,因为当我们从一行选择至另一行时,先触发原行号的状态变事件,然后触发新行号的状态变更事件,也就是换一次行,触发两次事件。

private void dataGridView1_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
{
// if (e.Row.Index == -1)
// {
// return;
// }
//
// if (int.TryParse(dataGridView1.Rows[e.Row.Index].Cells["ID"].Value.ToString(), out int intTryResult))
// {
// int.Parse(dataGridView1.Rows[e.Row.Index].Cells["ID"].Value.ToString());
// }
//
// TableJson json = tableJsons.Find(s => s.ID == intTryResult);
//
// if (!e.Row.Selected)
// {
// if (json.StartTime != DateTime.MinValue)
// {
// if (this.tgtControl1.LabelSrcText != "undefined")
// {
// try
// {
// json.EndTime = DateTime.Now;
// json.TimeSpan = json.EndTime - json.StartTime + json.TimeSpan;
// DataTable table = (DataTable)this.dataGridView1.DataSource;
// table.Rows[json.ID - 1]["time"] =
// json.TimeSpan.ToString(
// @"hh\:mm\:ss"); //table.Rows[json.ID - 1]["timer"] = json.TimeSpan.ToString(@"hh\:mm\:ss");
// }
// catch (Exception exception)
// {
// Console.WriteLine(exception);
// throw;
// }
// }
// }
// }
// else
// {
// json.StartTime = DateTime.Now;
// }
}

datagridview滚动的时候,也会执行RowStateChanged2次。最上一行与最下一行。

SelectionChanged 与 RowLeave

选中行时,使用SelectionChanged,离开行时,使用RowLeave

1、使用SelectionChanged事件

MSDN的事件说明:此事件会在选择或取消选择单元格(无论是以编程方式还是通过用户操作的方式)时发生(所以此事件与CurrentCellChanged一样,是针对单元格设计的,DataGridView本身就是针对单元格设计的)。例如,当您希望显示当前选定的单元格之和时,此事件非常有用。当您更改 CurrentCell 属性的值时,SelectionChanged 事件发生在 CurrentCellChanged 事件之前。此时访问 CurrentCell 属性的任何 SelectionChanged 事件处理程序都将获取其以前的值。

说明:我们要求的是行号改变时才触发事件,那么我们可以在事件后判断行号是否发生变化,或者将selectionmode属性设置为FullRowSelection,也就是整行选择模式,这样就可以实现要求了。

问题:在初始化DataGridView时,系统会触发N次SelectionChanged事件,而我们希望用户通过鼠标点击或键盘选择的方式改变行号时才触发事件,所以我们还需要设置一个开关,用来指示什么时候开始处理该事件。

2、使用CurrentCellChanged事件(!!!)

说明:这个就是当前单元格发生变化时触发的事件,用法和问题和SelectionChanged事件几乎一样,但是触发顺序不同。因为SelectionChanged要发生在CurrentCellChanged之前,所以用dataGridView1.Rows[xx].Selected = true;的形式或dataGridView1.CurrentCell = dataGridView1.Rows[xx].Cells[xx]改变单元格时,用SelectionChanged事件获取的CurrentCell值为改变之前的值,而一般情况我们想要获取的是改变后的值,所以SelectionChanged就无法实现我们的要求。

所以:一般情况,我们更多的使用CurrentCellChanged事件。

当然,CurrentCellChanged事件也有一些问题,例如窗体加载完毕后,CurrentCell 从NULL被默认赋值为第一行第一列时,系统会触发CurrentCellChanged事件,而一般情况我们只希望用户点击或代码控制的方式触发事件。类似的情况在SelectionChanged事件则不会发生。

总结:如果不需要使用代码改变CurrentCell 的值,而仅需要响应鼠标和键盘给CurrentCell 带来的变化,那就使用SelectionChanged事件吧,否则,使用CurrentCellChanged可能更能实现任务要求。一般情况下是这样。

这里有个问题。RowLeave 在焦点从datagridview到其他控件上,例如textbox选中时,也会执行RowLeave事件。这里判断dataGridView1.Focused看焦点是否在datagridview上。

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
var row = dataGridView1.CurrentRow; //当前行
if (int.TryParse(dataGridView1.Rows[row.Index].Cells["ID"].Value.ToString(), out int intTryResult))
{
int.Parse(dataGridView1.Rows[row.Index].Cells["ID"].Value.ToString());
} TableJson json = tableJsons.Find(s => s.ID == intTryResult); json.StartTime = DateTime.Now;
} private void dataGridView1_RowLeave(object sender, DataGridViewCellEventArgs e)
{
//指示该控件是否有焦点,
//判断是否其他控件获取焦点,就不执行。
if (dataGridView1.Focused)
{
if (int.TryParse(dataGridView1.Rows[e.RowIndex].Cells["ID"].Value.ToString(), out int intTryResult))
{
int.Parse(dataGridView1.Rows[e.RowIndex].Cells["ID"].Value.ToString());
} TableJson json = tableJsons.Find(s => s.ID == intTryResult); if (this.tgtControl1.LabelSrcText != "undefined")
{
try
{
json.EndTime = DateTime.Now;
json.TimeSpan = json.EndTime - json.StartTime + json.TimeSpan;
DataTable table = (DataTable)this.dataGridView1.DataSource;
table.Rows[json.ID - 1]["time"] =
json.TimeSpan.ToString(
@"mm\:ss"); //table.Rows[json.ID - 1]["timer"] = json.TimeSpan.ToString(@"hh\:mm\:ss");
}
catch (Exception exception)
{
Console.WriteLine(exception);
throw;
}
}
}
}

【winform】datagridview获取当前行停留时间的更多相关文章

  1. C# Winform DataGridView获取单元格的值

    1,可以直接通过DataGridView的重载运算符[]直接获取 使用方法: dataGridView[columnIndex][rowsIndex].Value.ToString().//colum ...

  2. winform datagridview如何获取索引 分类: DataGridView 2014-04-11 13:42 216人阅读 评论(0) 收藏

    datagridview.CurrentCell.RowIndex;            是当前活动的单元格的行的索引 datagridview.SelectedRows  ;           ...

  3. DataGrid获取当前行某列值

    前言: 本文将给大家介绍一下, 在ASP.NET MVC环境下,如何利用Jquery MiniUI(一个专业WebUI控件库)来获取Datagrid中的值,官网没有涉及到的内容:如何获取当前行某一列的 ...

  4. C#实现WinForm DataGridView控件支持叠加数据绑定

    我们都知道WinForm DataGridView控件支持数据绑定,使用方法很简单,只需将DataSource属性指定到相应的数据源即可,但需注意数据源必须支持IListSource类型,这里说的是支 ...

  5. C# winform DataGridView 常见属性

    C# winform DataGridView 属性说明① 取得或者修改当前单元格的内容 ② 设定单元格只读 ③ 不显示最下面的新行 ④ 判断新增行 ⑤ 行的用户删除操作的自定义 ⑥ 行.列的隐藏和删 ...

  6. 关于C# Winform DataGridView 设置DefaultCellStyle无效的原因与解决方案

    上周在开发Winform 项目中,我曾遇到一个看似简单,但一直都没有解决的问题,那就是:设置winform DataGridView控件的行DefaultCellStyle,但却没有任何变化,我也曾求 ...

  7. ASP.NET中gridview获取当前行的索引值

    在用GridView控件时,我们经常会碰到获取当前行的索引,通过索引进行许多操作.例如,可以获得当前行某一个控件元素:设置某一元素的值等等.下面结合实例介绍几种获得GridView当前行索引值的方法. ...

  8. GridView获取当前行

    int row = ((GridViewRow)((DropDownList)sender).NamingContainer).RowIndex; //获取GridView里的DropDownList ...

  9. Extjs给gridPanel添加单价双击事件和获取当前行的数据

    有两个小属性,如下 this.on('rowdblclick', this.readContent, this); this.on('cellclick', this.gridCellClick, t ...

随机推荐

  1. 23个Python爬虫开源项目代码,让你一次学个够

    今天为大家整理了23个Python爬虫项目.整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心.所有链接指向GitHub,祝大家玩的愉快 1.WechatSogou [1]– 微信公众号 ...

  2. mybatis操作mysql的奇淫技巧总结(代码库)

    1.添加公共sql代码段 使用<sql> 和 <include> 标签 <sql id="userSubassemblyRecordParam"> ...

  3. VMware下安装linux虚拟机

    安装VMware [下一步] [下一步] 点击[自定义],[下一步] 更改安装目录,[下一步] [下一步] [下一步] [跳过] [完成] 点击桌面图标 如下勾选,输入邮箱,[继续] [完成] 安装l ...

  4. golang 笔记

    golang 的坑 package main import ( "fmt" "net/http" "time" ) func Hello(w ...

  5. 主机管理+堡垒机系统开发:strace工具的实现原理(七)

    strace是Linux系统下的一个用来跟踪系统调用的工具,它的实现基础是ptrace系统调用.使用strace工具可以跟踪一个程序执行过程中发生的系统调用. 我这里讲到的内容有一点点和mips体系相 ...

  6. CMDB服务器管理系统【s5day90】:获取今日未采集主机列表

    1.目录结构 1.服务器端 2.客户端 2.具体代码如下 1.数据库增加两个字段 class Server(models.Model): """ 服务器信息 " ...

  7. makefile $@, $^, $<, $? 表示的意义

    ref:https://www.cnblogs.com/gamesun/p/3323155.html $@  表示目标文件$^  表示所有的依赖文件$<  表示第一个依赖文件$?  表示比目标还 ...

  8. 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式

    一. 背景 说起EF的增删改操作,相信很多人都会说,有两种方式:① 通过方法操作  和  ② 通过状态控制. 相信你在使用EF进行删除或修改操作的时候,可能会遇到以下错误:“ The object c ...

  9. [数学笔记Mathematical Notes]目录

    2.也许是一个问题,暂时没给出解答. 2015年7月5日 1. 这个一个笔记类型的数学杂志, 打算用来记录自己学数学时做的笔记,一般几页纸一期. 觉得有意思就摘抄下来,或者自己的感想. 可能有些不是原 ...

  10. [物理学与PDEs]第2章习题12 严格凸性的转换

    设 $L=L(\xi_0,\xi_1,\cdots,\xi_n)$ 关于变量 $\xi_0>0,\xi_1,\cdots,\xi_n$ 为严格凸的. 证明函数 $$\bex M=\cfrac{1 ...