之前我问过一个关于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次,很奇怪
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次,很奇怪
if (e.ColumnIndex == 2) //在第三列画
如果有二行记录,那么它会进去2次。(第一行有第三列,同样第二行也有第三列)
在每次需要重画SubItem时就调用它.因此有多少个SubItem需重画就执行多少次.
private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
.......
if (e.ColumnIndex == 2) //在第三列画
{
.... //如果是第三列的SubItem,执行该画法
}
else
{
e.DrawDefault = true; //如果不是第三列,则执行缺省的画法.
} }
看来LZ 对listView1_DrawSubItem的理解有错误.
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);
这样的话,有三行三列的话,即使最后一列没有值,它会画6次啊,也就是说还是多画了一遍?UP
这里只有在有单元格需重画时便执行,有多少个要重画就执行多少次,有点类似 _paint() 重绘事件;
只是这里的 _paint()对应的是每个单元格.
你只需定义好每个单元格怎么画就行了.你可以把所有的单元格想象成一个个textbox,而每个textbox都关联了同一个重绘事件,就是这里的listView1_DrawSubItem.
通过"e.ColumnIndex"知道是那一列, "e.ItemIndex"是那一行.....
由此决定怎么画.