问题描述
我使用RowStateChanged方法为datagridview设置行号,privatevoiddgvFlowPath_RowStateChanged(objectsender,DataGridViewRowStateChangedEventArgse){//显示行号e.Row.HeaderCell.Value=string.Format("{0}",e.Row.Index+1);}如果仅仅是使用上述代码没有任何问题,现在问题的关键是,在画面load的时候,我add了40行的空白行,使用上述代码,40行都会有行号,而我只需要将datagridview上有数据的行显示行号,没有数据的行不需要行号,但是空白行还是需要显示的,我使用了如下代码进行判断privatevoiddgvFlowPath_RowStateChanged(objectsender,DataGridViewRowStateChangedEventArgse){if(dgvFlowPath.Rows.Count>0){if(Convert.ToString(e.Row.Cells["OperateNo"].Value)!=""){//显示行号e.Row.HeaderCell.Value=string.Format("{0}",e.Row.Index+1);}}}画面加载或刷新的时候不显示行号,如果我将右面的滚动条下拉,然后再上拉,行号就显示出来了,请问各位大虾,该如何解决?
解决方案
解决方案二:
如果数据量不大,换RowPostPaint事件自己画行号试试。
解决方案三:
这行号你就不能作为数据的一列条件吗,为何要在事件里去添加。而且你判断下其他列是否全是空就是空行,或者直接加个隐藏列表示是空行,判断下不就行了
解决方案四:
楼上说的有道理
解决方案五:
但是在事件中为什么就不能进行判断了呢?断点显示都是正常的,就是显示的时候有问题
解决方案六:
if(Convert.ToString(e.Row.Cells["OperateNo"].Value)!="")改if(!string.IsNullOrEmpty(Convert.ToString(e.Row.Cells["OperateNo"].Value))试试
解决方案七:
我没有使用过dev,不知道它具体的机制。我给你说一下大多数高级的UI组件的做法。大型的Grid组件都不是像你想象的那样去有无数的“行视图”的,它们不会有上万行可见的行视图,它们通常会循环复用少数几十个行视图来显示上万、数十万数据。也就是说,当你用鼠标向下拉动时从Grid底部进入的行视图会复用之前从顶部消失的一些行视图,当你用鼠标向上拉动时从Grid顶部进入的行视图会复用之前从底部消失的一些行视图,在内存中总是仅仅保留一少部分行视图对象,而不会随着数据行的多少而增加。比如说一共有100行数据,那么控件可能只会用30个行视图来循环显示(绑定)这100行数据。因此Grid控件的许多事件,是说控件的行视图底层的事件触发了,它假设你懂的行视图本身就是重复使用的,它给你机会来硬编码。例如有些早已经滚动出可见区域的row,假设某一行的某个单元已经设置了背景为红色,那么当它用于新的滚动入可见区域的行时,假设相同单元也需要设置背景为红色,那么你就不需要再去设置了,它已经是红色的了。反之,假设新数据根本不需要设置为红色背景,此时你会发现新数据的背景却是红色的(除非你刻意重设置了背景)。因此在这类Grid组件中,通常都有类似Grid_RowExited、Grid_RowEntering
之类的事件,让你对行视图做手工清理、或者重新初始化。如果不做这些处理,你会发现你直接从行视图去获得信息是乱的(出现了根本不该有的数据)。在使用这类UI组件的编程中,通常不应该直接读取行视图,也就是不应该写e.Row.Cells["OperateNo"]这种语句,而应该读取e.Row所绑定的数据源中数据行的值。因为行视图的相关事件触发时,是底层行视图控件本身的事件,此时你去读取的完全可能是之前滚动出Grid可见区域的缓存着的Row控件的数据,而不是当前滚动进入可见区域的数据,此时应该读取数据源上的数据而不是控件的数据。如果你根据这个原理而设计测试用例,是可以轻易发现这两个数据读取方式返回的结果是不一样的。
解决方案八:
sp1234牛
解决方案九:
CellFormatting这个事件