真正简单的Datagridview显示行号方法

woo_rain 2011-05-10 09:45:27
最近使用VB2005里的Datagridview控件做一个小程序,希望能在表格中显示行号,在网上搜索半天,网友提供的方法主要有两种:
1、使用通过textrenderer.drawtext在行的标题位置绘制文本....
(俺是菜鸟,看着这个方法都觉得有点烦,虽然大虾们提供的程序行数并不多,但实现原理还是有点复杂)

2、通过在Datagridview控件的RowsPostpaint事件中增加处理代码,遍历Datagridview的每一行,通过在行的HeaderCell里写入行号实现。

个人觉得上两种方法都有点复杂,方法一没有使用Datagridview本身的功能,方法二经常需要遍历Datagridview的每一行,如果行数太多的话肯定效率不会高。

在上述方法的启示下,我找到了Datagridview的RowStateChanged事件,只需在该事件处理程序中加上一行代码即可为Datagridview显示行号了,代码如下:
e.Row.HeaderCell.Value = (e.Row.Index + 1).ToString

不过我的方法还有个问题,如果插入和删除行号,后续行的行号不会相应变动,于是我通过在Datagridview的RowsAdded和RowsRemoved事件处理程序中加入了如下代码:
Dim longRow As Long
For longRow = e.RowIndex + e.RowCount - 1 To DataGridProjects.Rows.GetLastRow(DataGridViewElementStates.Displayed)
DataGridProjects.Rows(longRow).HeaderCell.Value = (longRow + 1).ToString
Next

请注意,上述代码中仅对已在屏幕显示的行的行号进行了修改,不像前述方法一样需要遍历控件的每一行!

经测试,该方法完美解决了Datagridview的行号显示问题,因本人初学,也可能存在更为简单的解决方法没能通过网络搜到,仅将我的方法贴出来供大家探讨,希望高手多多批评指正!
...全文
2919 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
百战天王 2011-11-09
  • 打赏
  • 举报
回复
因为"123"的"23"被遮住了...
[Quote=引用 9 楼 han208 的回复:]

引用楼主 woo_rain 的回复:
最近使用VB2005里的Datagridview控件做一个小程序,希望能在表格中显示行号,在网上搜索半天,网友提供的方法主要有两种:
1、使用通过textrenderer.drawtext在行的标题位置绘制文本....
(俺是菜鸟,看着这个方法都觉得有点烦,虽然大虾们提供的程序行数并不多,但实现原理还是有点复杂)

2、通过在Datagridvie……
[/Quote]
jane_zhao 2011-08-31
  • 打赏
  • 举报
回复
比较好的做法,谢谢分享!
我通常都是在每行的第一列显示行号...没你这种方法简洁..
pingker 2011-08-31
  • 打赏
  • 举报
回复
好方法,值得学习。好的知识能够分享,人品也非常的不错。
acmepoyen 2011-08-30
  • 打赏
  • 举报
回复
效果果然不错~~~~感谢LZ分享
wxl3833090 2011-08-29
  • 打赏
  • 举报
回复
MARK!学习了
rmini 2011-08-28
  • 打赏
  • 举报
回复
收藏学习了
琴弦里的海 2011-08-26
  • 打赏
  • 举报
回复
这个问题我也整了好久,还是没法解决,呵呵
琴弦里的海 2011-08-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 woo_rain 的回复:]
最近使用VB2005里的Datagridview控件做一个小程序,希望能在表格中显示行号,在网上搜索半天,网友提供的方法主要有两种:
1、使用通过textrenderer.drawtext在行的标题位置绘制文本....
(俺是菜鸟,看着这个方法都觉得有点烦,虽然大虾们提供的程序行数并不多,但实现原理还是有点复杂)

2、通过在Datagridview控件的RowsPostpaint事件中增……
[/Quote]
我每行都能显示数据了,但是不是规律的数据行,显示1-9后,就变化了,有时候全部是1,有时候有调整到1-9.。。我用的是SYBASE的数据源。
ymx1121 2011-08-26
  • 打赏
  • 举报
回复
谢谢楼主分享。
wrencwd 2011-08-26
  • 打赏
  • 举报
回复
方法三:
VB.NET code
Private _num As Integer
Public Sub New()
Me._num = 0
End Sub
Protected Overridable Function BindNum() As Integer
Me._num = (Me._num + 1)
Return _num
End Function
Html code
<asp:TemplateField HeaderText="编号">
<ItemTemplate>
<%# BindNum() %>
</ItemTemplate>
</asp:TemplateField>
law_siomon 2011-08-26
  • 打赏
  • 举报
回复
woo_rain的方法非常棒
yanlongwuhui 2011-06-30
  • 打赏
  • 举报
回复
参考如下:
Dim dgv As DataGridView
dgv = TryCast(sender, DataGridView)
Dim rt As New Rectangle(e.RowBounds.Location.X, e.RowBounds.Location.Y, dgv.RowHeadersWidth - 2, e.RowBounds.Height)
TextRenderer.DrawText(e.Graphics, e.RowIndex + 1, dgv.RowHeadersDefaultCellStyle.Font, rt, Color.Black)
dgv = Nothing
小妹妹 2011-06-30
  • 打赏
  • 举报
回复
private void dataGridView1_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e)
{
e.Row.HeaderCell.Value = e.Row.Index + 1;
}
这样好像还是不会显示行号诶
woo_rain 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 shy198l 的回复:]
HTML code

<Columns>
<asp:TemplateField ItemStyle-HorizontalAlign="Right">
<ItemTemplate>
<%# Container.DataItemIndex + 1 %>
</ItemTemplate>
</a……
[/Quote]

呵呵,我写的是开发Windows应用程序,不是ASP .NET哦,这个我不懂的!不知道Windows窗体的Datagridview控件有没有更好的显示行号的方法?
song_java 2011-05-10
  • 打赏
  • 举报
回复

<Columns>
<asp:TemplateField ItemStyle-HorizontalAlign="Right">
<ItemTemplate>
<%# Container.DataItemIndex + 1 %>
</ItemTemplate>
</asp:TemplateField>
</Columns>
song_java 2011-05-10
  • 打赏
  • 举报
回复

<Columns>
<asp:TemplateField ItemStyle-HorizontalAlign="Right">
<ItemTemplate>
<%# Container.DataItemIndex + 1 %>
</ItemTemplate>
</asp:TemplateField>
</Columns>

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧