还是ListView加图片的问题

ybgiser 2009-04-08 06:23:51
之前我问过一个关于ListView第三列加图片的问题。用的是listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)的事件,但是问题是我每次画的时候它总要多画几次。不知道问题到底在哪?下面是我的代码,请高手指教啊,谢谢
private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
Image tmp_image = this.imageList1.Images[0]; //声明Image实例,用来指定后面要画的那个图标
Rectangle rect = new Rectangle(); //指明画的矩形对象
if (e.ColumnIndex == 2) //在第三列画
{
foreach (string s in arrlist) //arrlist是一个动态的字符串数组,用来存储图片名称(大于,等于,小于,不等于)
{
index = s; //index是传入值,例如:当index得到的值是“大于”,它就只会画大于的那个图标
switch (index)
{
case "大于":
tmp_image = this.imageList1.Images[0];
break;
case "等于":
tmp_image = this.imageList1.Images[1];
break;
case "小于":
tmp_image = this.imageList1.Images[2];
break;
case "不等于":
tmp_image = this.imageList1.Images[3];
break;
}
rect.X = e.Bounds.X;
rect.Y += e.Bounds.Y;
rect.Width = tmp_image.Width;
rect.Height = e.Bounds.Height;
e.Graphics.DrawImage(tmp_image, rect);

}
}
else
{
e.DrawDefault = true;
}


逻辑上没有问题吧?每次执行最后那个括号时候应该就跳出该事件了啊,但是为什么它还是要再进去多执行2次,很奇怪
...全文
217 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ybgiser 2009-04-10
  • 打赏
  • 举报
回复
功能实现了,但是感觉画的不是很干净
h_w_king 2009-04-09
  • 打赏
  • 举报
回复
将你上面的代码改改就行了.
private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
Image tmp_image = this.imageList1.Images[0]; //声明Image实例,用来指定后面要画的那个图标
Rectangle rect = new Rectangle(); //指明画的矩形对象
if (e.ColumnIndex == 2) //在第三列画
{

switch (e.SubItem.Text)
{
case "大于":
tmp_image = this.imageList1.Images[0];
break;
case "等于":
tmp_image = this.imageList1.Images[1];
break;
case "小于":
tmp_image = this.imageList1.Images[2];
break;
case "不等于":
tmp_image = this.imageList1.Images[3];
break;
}
rect.X = e.Bounds.X;
rect.Y += e.Bounds.Y;
rect.Width = tmp_image.Width;
rect.Height = e.Bounds.Height;
e.Graphics.DrawImage(tmp_image, rect);


}
else
{
e.DrawDefault = true;
}

}
这样第三列就不会显示"大于","等于"...这些,而是显示图标了.

当给ListView加一条记录时.
 
ListViewItem t=new ListViewItem();
t.Text="aaa";

ListViewItem.ListViewSubItem s=new ListViewItem.ListViewSubItem();
s.Text="22";
t.SubItems.Add(s);

s = new ListViewItem.ListViewSubItem();
s.Text = "大于";
t.SubItems.Add(s);


s = new ListViewItem.ListViewSubItem();
s.Text = "dfddf";
t.SubItems.Add(s);

this.listView1.Items.Add(t);
ybgiser 2009-04-09
  • 打赏
  • 举报
回复
可否用一个专门的图片控件一行行的显示图片,用什么控件比较好呢
fly_to_sky 2009-04-09
  • 打赏
  • 举报
回复
学习,顶贴
h_w_king 2009-04-09
  • 打赏
  • 举报
回复
listView1_DrawSubItem.
在每次需要重画SubItem时就调用它.因此有多少个SubItem需重画就执行多少次.
private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
.......
if (e.ColumnIndex == 2) //在第三列画
{
.... //如果是第三列的SubItem,执行该画法
}
else
{
e.DrawDefault = true; //如果不是第三列,则执行缺省的画法.
}

}
看来LZ 对listView1_DrawSubItem的理解有错误.
ybgiser 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cja03 的回复:]
在进行绘制时,DrawSubItem的次数决定于你有多少个SubItem。
if (e.ColumnIndex == 2) //在第三列画
如果有二行记录,那么它会进去2次。(第一行有第三列,同样第二行也有第三列)
[/Quote]

这样的画想指定某一个记录里画某张图片的功能就不能实现了啊。不知道还有没有其他的方法啊?UP
h_w_king 2009-04-09
  • 打赏
  • 举报
回复
为什么会有画多少次的问题?
这里只有在有单元格需重画时便执行,有多少个要重画就执行多少次,有点类似 _paint() 重绘事件;
只是这里的 _paint()对应的是每个单元格.
你只需定义好每个单元格怎么画就行了.

你可以把所有的单元格想象成一个个textbox,而每个textbox都关联了同一个重绘事件,就是这里的listView1_DrawSubItem.
通过"e.ColumnIndex"知道是那一列, "e.ItemIndex"是那一行.....
由此决定怎么画.

ybgiser 2009-04-09
  • 打赏
  • 举报
回复
h_w_king ,你好
这样的话,有三行三列的话,即使最后一列没有值,它会画6次啊,也就是说还是多画了一遍?UP
cja03 2009-04-08
  • 打赏
  • 举报
回复
在进行绘制时,DrawSubItem的次数决定于你有多少个SubItem。
if (e.ColumnIndex == 2) //在第三列画
如果有二行记录,那么它会进去2次。(第一行有第三列,同样第二行也有第三列)

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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