之前我问过一个关于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次,很奇怪

解决方案 »

  1.   

    在进行绘制时,DrawSubItem的次数决定于你有多少个SubItem。
    if (e.ColumnIndex == 2)              //在第三列画
    如果有二行记录,那么它会进去2次。(第一行有第三列,同样第二行也有第三列)
      

  2.   

    listView1_DrawSubItem.
    在每次需要重画SubItem时就调用它.因此有多少个SubItem需重画就执行多少次.
    private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) 

       ....... 
    if (e.ColumnIndex == 2)              //在第三列画 
           {  
               ....   //如果是第三列的SubItem,执行该画法
           } 
      else 
         { 
             e.DrawDefault = true; //如果不是第三列,则执行缺省的画法.
         }  }
    看来LZ 对listView1_DrawSubItem的理解有错误.
      

  3.   

    将你上面的代码改改就行了.
    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);
      

  4.   

    h_w_king ,你好
    这样的话,有三行三列的话,即使最后一列没有值,它会画6次啊,也就是说还是多画了一遍?UP
      

  5.   

    为什么会有画多少次的问题?
    这里只有在有单元格需重画时便执行,有多少个要重画就执行多少次,有点类似 _paint() 重绘事件;
    只是这里的 _paint()对应的是每个单元格.
    你只需定义好每个单元格怎么画就行了.你可以把所有的单元格想象成一个个textbox,而每个textbox都关联了同一个重绘事件,就是这里的listView1_DrawSubItem.
    通过"e.ColumnIndex"知道是那一列, "e.ItemIndex"是那一行.....
    由此决定怎么画.