none
关于ListView中Item内容显示的问题 RRS feed

  • 问题

  • 我先把问题描述一下,是这样的,我有一个LISTVIEW,是显示图片的,我想在每个图片的Item的右上角显示一个记录号(1,2,3,4....N),请问如果实现;注意:不是在所加载的图片上的右上角显示,我将所有的图片随机排序后,所显示的记录号同样是(1,2,3,4....N),虽然照片的顺序乱了,但记录号同样是按照有序排列.
    请问怎么解决,在线等.....
    2009年7月26日 2:11

答案

  • 那对于选中的项,就画上一点特别的东西,要是做到和系统默认的选种状态一样的模样,还是需要慢慢画的,比较考验“绘画”技巧,下面的代码只是示例一下,让选中项有点不同:

    private void lv_DrawItem(object sender, DrawListViewItemEventArgs e)
    {
    	//e.DrawDefault = true;
    	Image img = imgList.Images[e.Item.ImageIndex];
    	Brush itemTextBrush = e.Item.Selected ? SystemBrushes.HighlightText : SystemBrushes.ControlText;
    	if (e.Item.Selected)
    	{
    		e.Graphics.FillRectangle(SystemBrushes.Highlight, e.Bounds);
    		e.DrawFocusRectangle();
    	}
    	e.Graphics.DrawImage(img, e.Bounds.X, e.Bounds.Y);	//画图片
    	e.Graphics.DrawString(e.Item.Text, e.Item.Font, itemTextBrush, e.Bounds.X, e.Bounds.Y + img.Height);	//画项文本
    	e.Graphics.DrawString(Convert.ToString(e.ItemIndex + 1), this.Font, Brushes.Red, e.Bounds.X + 5, e.Bounds.Y);	//画序号
    }


    理解的越多,需要记忆的就越少
    • 已标记为答案 廖中洪 2009年7月31日 11:16
    2009年7月30日 15:30
    版主

全部回复

  • 各位牛人帮帮忙啊!!!
    2009年7月26日 3:36
  • 你好,可以在数据库读取数据的时候,添加ROW_NUMBER()

    SELECT ROW_NUMBER() OVER (ORDER BY Age) AS [Row Number by Age],
    FirstName,
    Age
    FROM Person

    出现的数据如下
    Row Number by Age                FirstName            Age
    --------------------------                 ----------            --------
    1                                                Larry                   5
    2                                                Doris                   6
    3                                                George               6
    4                                                Mary                   11
    5                                                Sherry                 11
    6                                                Sam                    17
    7                                                Ted                     23
    8                                                Marty                   23
    9                                                Sue                     29
    10                                              Frank                  38
    11                                              John                    40
    jon.valett@gmail.com
    2009年7月26日 4:59
    版主
  • 你好,可以在数据库读取数据的时候,添加ROW_NUMBER()

    SELECT ROW_NUMBER() OVER (ORDER BY Age) AS [Row Number by Age],
    FirstName,
    Age
    FROM Person

    出现的数据如下
    Row Number by Age                FirstName            Age
    --------------------------                 ----------            --------
    1                                                Larry                   5
    2                                                Doris                   6
    3                                                George               6
    4                                                Mary                   11
    5                                                Sherry                 11
    6                                                Sam                    17
    7                                                Ted                     23
    8                                                Marty                   23
    9                                                Sue                     29
    10                                              Frank                  38
    11                                              John                    40
    jon.valett@gmail.com

    你好,是这样的,我的LISTVIEW不是以列表的形式显示的,是显示的图片,我想到达的功能是在每张图片的Item的右上角显示索引
    2009年7月26日 5:01
  • 我觉得可以考虑2个办法:
    1、设置ListView属性的OwnerDraw属性为true,然后利用DrawItem以及DrawSubItem来自行绘制。
    2、编辑你的图片对象,为图片绘制上数字。

    理解的越多,需要记忆的就越少
    2009年7月26日 7:00
    版主
  • 你好,上面的代码是生成了索引,你可以把这些索引绘制在你想要的图片上,或者绑定预先存在的图片!
    jon.valett@gmail.com
    2009年7月26日 10:49
    版主
  • 你好,不太明白你的意思,如果只是想显示按照顺序的索引 你可以通过 ListViewItem.Index 来获取索引

    如果你是邹俊才版主的意思可以按照他的说法做
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年7月28日 2:33
    版主
  • 你好,不太明白你的意思,如果只是想显示按照顺序的索引 你可以通过 ListViewItem.Index 来获取索引

    如果你是邹俊才版主的意思可以按照他的说法做
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond

    你好,我的意思是,我有个图片缩略图浏览器(类似WINDOWS资源管理器里显示图片缩略略一样,是用的ListView),如果在每个缩略图的右上角显示图片的当前序号,如果我将顺序打乱后,图片重新计算当前所在的序号.不知道我这样说明白不?
    2009年7月29日 2:58
  • 你好,请问你的打乱方式是:前台排序,还是后台数据的增删!
    jon.valett@gmail.com
    2009年7月29日 3:00
    版主
  • 你好,上面的代码是生成了索引,你可以把这些索引绘制在你想要的图片上,或者绑定预先存在的图片!
    jon.valett@gmail.com

    我以前是像你说的这样完成的,但是这样操作比较复杂,因为如果我乱序后,又要重新加载图片缩略图,再在缩略图上画序号,这样比较慢!
    2009年7月29日 3:01
  • 你好,可以使用CSS+DiV,把一个有数字的DIV层放在图片的上面!
    jon.valett@gmail.com
    2009年7月29日 3:03
    版主
  • 你好,不太明白你的意思,如果只是想显示按照顺序的索引 你可以通过 ListViewItem.Index 来获取索引

    如果你是邹俊才版主的意思可以按照他的说法做
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond

    你好,我的意思是,我有个图片缩略图浏览器(类似WINDOWS资源管理器里显示图片缩略略一样,是用的ListView),如果在每个缩略图的右上角显示图片的当前序号,如果我将顺序打乱后,图片重新计算当前所在的序号.不知道我这样说明白不?

    你好,既然是这样直接用ListViewItem.Index就可以了 也就是说你这也无需管图片的实际序号对吧
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年7月29日 6:14
    版主
  • 有点乱了....我重新整理一下,比如:


          图片A(1)           图片B(2)           图片C(3)           图片D(4)           图片E(5)
          图片A(6)           图片B(7)           图片C(8)           图片D(9)           图片E(10)
          图片A(11)         图片B(12)         图片C(13)         图片D(14)          图片E(15)
          图片A(16)         图片B(17)         图片C(18)         图片D(19)          图片E(20)
          图片A(21)         图片B(22)         图片C(23)         图片D(24)          图片E(25)

    显示的图片如上(其中1-25为ListView的每个图标方框内右上角显示的序号,是必须显示在上面的)
    现在我随机排序


          图片E(1)           图片B(2)           图片A(3)           图片D(4)           图片C(5)
          图片A(6)           图片D(7)           图片C(8)           图片D(9)           图片E(10)
          图片C(11)         图片B(12)         图片C(13)         图片B(14)          图片A(15)
          图片A(16)         图片E(17)         图片C(18)         图片D(19)          图片E(20)
          图片A(21)         图片B(22)         图片E(23)         图片D(24)          图片B(25)

    比如随机排序后的图片如上
    照片的顺序打乱后,要求的是显示在右上角的序号不能打乱,还是有序显示!



    这样我想大家明白了吧!
    2009年7月30日 1:55
  • 你好,还是按我原来的方法就可以了,只不过你说缩略图上画序号,这样比较慢,可以不生成缩略图,而是在图的上方加一个DIV层,把从数据库生成的序号放在DIV层上,这样可以实现!
    jon.valett@gmail.com
    2009年7月30日 2:00
    版主
  • 楼主做的是Windows程序吧。我做了一个例子,楼主可以参考。效果如下图:


    方法是:
    1、设置ListView控件的OwnerDraw属性为true,这样ListView中的各项需要我们自己来绘制
    2、编写ListView控件的DrawItem事件的事件处理方法,如下代码:
    private void lv_DrawItem(object sender, DrawListViewItemEventArgs e)
    {
    	e.DrawDefault = true;
    	e.Graphics.DrawString(Convert.ToString(e.ItemIndex + 1), this.Font, Brushes.Red, e.Bounds.X + 5, e.Bounds.Y);
    }
    其中DrawDefault属性设置为true可以让控件绘制出默认需要绘制的内容。而增加序号的工作,在第二行代码中进行。如果需要调整需要的位置,只需要调整DrawString方法的最后2个参数的值即可。
    另外因为绘制的是当前项的序号,所以不管怎么调整图片或者增减项都不会导致序号的显示错乱。


    理解的越多,需要记忆的就越少
    2009年7月30日 2:42
    版主
  • 楼主做的是Windows程序吧。我做了一个例子,楼主可以参考。效果如下图:


    方法是:
    1、设置ListView控件的OwnerDraw属性为true,这样ListView中的各项需要我们自己来绘制
    2、编写ListView控件的DrawItem事件的事件处理方法,如下代码:
    private void lv_DrawItem(object sender, DrawListViewItemEventArgs e)
    
    {
    
    	e.DrawDefault = true;
    
    	e.Graphics.DrawString(Convert.ToString(e.ItemIndex + 1), this.Font, Brushes.Red, e.Bounds.X + 5, e.Bounds.Y);
    
    }
    
    
    其中DrawDefault属性设置为true可以让控件绘制出默认需要绘制的内容。而增加序号的工作,在第二行代码中进行。如果需要调整需要的位置,只需要调整DrawString方法的最后2个参数的值即可。
    另外因为绘制的是当前项的序号,所以不管怎么调整图片或者增减项都不会导致序号的显示错乱。


    理解的越多,需要记忆的就越少

    嘿嘿....谢谢这位兄弟,就是这样的,但还有一个小小的问题,图标过多的时候,显示的序号就显示不完全了,显示不完的序号被图片遮住了,如序号"1234"字体设置大点,图片与图片之前的间隔距离设置近一点,那么就完全显示不完了!
    2009年7月30日 14:17
  • 你好,还是按我原来的方法就可以了,只不过你说缩略图上画序号,这样比较慢,可以不生成缩略图,而是在图的上方加一个DIV层,把从数据库生成的序号放在DIV层上,这样可以实现!
    jon.valett@gmail.com
    有代码吗,这方面我有点差,才接触不久
    2009年7月30日 14:19
  • 嗯,确实有那个问题,这说明,系统默认的绘制发生在这个事件之后,所以覆盖了我们的绘制。那我们就没有办法“偷懒”了,只能老老实实的“自己”画,不过也不麻烦,楼主试试下面的代码,同样,相关的位置只需要调整各个方面最后的2个未知参数即可。

    private void lv_DrawItem(object sender, DrawListViewItemEventArgs e)
    {
    	//e.DrawDefault = true;
    	Image img = imgList.Images[e.Item.ImageIndex];
    	e.Graphics.DrawImage(img, e.Bounds.X, e.Bounds.Y);	//画图片
    	e.Graphics.DrawString(e.Item.Text, this.Font, Brushes.Black, e.Bounds.X , e.Bounds.Y + img.Height);	//画项文本
    	e.Graphics.DrawString(Convert.ToString(e.ItemIndex + 1), this.Font, Brushes.Red, e.Bounds.X + 5, e.Bounds.Y);	//画序号
    }


    理解的越多,需要记忆的就越少
    2009年7月30日 14:36
    版主
  • 嗯,确实有那个问题,这说明,系统默认的绘制发生在这个事件之后,所以覆盖了我们的绘制。那我们就没有办法“偷懒”了,只能老老实实的“自己”画,不过也不麻烦,楼主试试下面的代码,同样,相关的位置只需要调整各个方面最后的2个未知参数即可。

    private void lv_DrawItem(object sender, DrawListViewItemEventArgs e)
    
    {
    
    	//e.DrawDefault = true;
    
    	Image img = imgList.Images[e.Item.ImageIndex];
    
    	e.Graphics.DrawImage(img, e.Bounds.X, e.Bounds.Y);	//画图片
    
    	e.Graphics.DrawString(e.Item.Text, this.Font, Brushes.Black, e.Bounds.X , e.Bounds.Y + img.Height);	//画项文本
    
    	e.Graphics.DrawString(Convert.ToString(e.ItemIndex + 1), this.Font, Brushes.Red, e.Bounds.X + 5, e.Bounds.Y);	//画序号
    
    }
    
    


    理解的越多,需要记忆的就越少

    不好意思,还要麻烦一下,看上去已经完成了,但发现在选择图片的时候,看不到哪些图片是被选中的
    2009年7月30日 14:48
  • 那对于选中的项,就画上一点特别的东西,要是做到和系统默认的选种状态一样的模样,还是需要慢慢画的,比较考验“绘画”技巧,下面的代码只是示例一下,让选中项有点不同:

    private void lv_DrawItem(object sender, DrawListViewItemEventArgs e)
    {
    	//e.DrawDefault = true;
    	Image img = imgList.Images[e.Item.ImageIndex];
    	Brush itemTextBrush = e.Item.Selected ? SystemBrushes.HighlightText : SystemBrushes.ControlText;
    	if (e.Item.Selected)
    	{
    		e.Graphics.FillRectangle(SystemBrushes.Highlight, e.Bounds);
    		e.DrawFocusRectangle();
    	}
    	e.Graphics.DrawImage(img, e.Bounds.X, e.Bounds.Y);	//画图片
    	e.Graphics.DrawString(e.Item.Text, e.Item.Font, itemTextBrush, e.Bounds.X, e.Bounds.Y + img.Height);	//画项文本
    	e.Graphics.DrawString(Convert.ToString(e.ItemIndex + 1), this.Font, Brushes.Red, e.Bounds.X + 5, e.Bounds.Y);	//画序号
    }


    理解的越多,需要记忆的就越少
    • 已标记为答案 廖中洪 2009年7月31日 11:16
    2009年7月30日 15:30
    版主