当前位置:编程学习 > C#/ASP.NET >>

C# 重写 Listview 的 OnDrawSubItem 函数实现 ProgressBar 进度条效果

一直想写一个带进度条的Listview组件,方便以后要用到,由于平时上班忙,没什么时间,下班时间又不想动,懒的写。就利用上班时间不忙的时候花了点时间写出来了。

注意:要重绘 Listview 子项,必须要将 Listview 的 OwnerDraw 属性值设置为 True ,否则即使你的重写将不会生效。

组件代码:


 
 

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Diagnostics; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Drawing; 
 
namespace Control.Listview 
{ 
    partial class ProgressListview 
    { 
        /// <summary>  
        /// Required designer variable.  
        /// </summary>  
        private System.ComponentModel.IContainer components = null; 
 
        /// <summary>   
        /// Clean up any resources being used.  
        /// </summary>  
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>  
        protected override void Dispose(bool disposing) 
        { 
            if (disposing && (components != null)) 
            { 
                components.Dispose(); 
            } 
            base.Dispose(disposing); 
        } 
 
        #region Component Designer generated code  
 
        /// <summary>  
        /// Required method for Designer support - do not modify  
        /// the contents of this method with the code editor.  
        /// </summary>  
        private void InitializeComponent() 
        { 
            components = new System.ComponentModel.Container(); 
        } 
 
        #endregion  
    } 
 
 
 
 
    public partial class ProgressListview : ListView 
    { 
        /// <summary>  
        /// 进度条列索引  
        /// </summary>  
        private int _progressColumnIndex = -1; 
        public int ProgressColumnIndex 
        { 
            get 
            { 
                return _progressColumnIndex; 
            } 
            set 
            { 
                _progressColumnIndex = value; 
            } 
        } 
 
        /// <summary>  
        /// 进度条最大值  
        /// </summary>  
        private int _progressMaximun = 100; 
        public int ProgressMaximun 
        { 
            get 
            { 
                return _progressMaximun; 
            } 
        } 
 
        public ProgressListview() 
        { 
            InitializeComponent(); 
        } 
 
        public ProgressListview(IContainer container) 
        { 
            container.Add(this); 
            InitializeComponent(); 
        } 
 
        protected override void OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e) 
        { 
            e.DrawDefault = true; 
            base.OnDrawColumnHeader(e); 
        } 
 
 
        protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e) 
        { 
            if (e.ColumnIndex == ProgressColumnIndex) 
            { 
                var item = e.Item.SubItems[1]; 
                var rect = item.Bounds; 
 
                //绘制进度条  
                var g = e.Graphics; 
                var progressRect = new Rectangle(rect.X + 1, rect.Y + 3, rect.Width - 2, rect.Height - 5); 
                g.DrawRectangle(new Pen(new SolidBrush(Color.Blue), 1), progressRect); 
 
                //绘制进度  
                var progressMaxWidth = progressRect.Width - 1; 
                var unit = (progressMaxWidth * 1.0) / (_progressMaximun * 100); 
                var fValue = float.Parse(item.Text); 
                var percent = fValue * unit * 100; 
                if (percent >= progressMaxWidth) percent = progressMaxWidth; 
                g.FillRectangle(new SolidBrush(Color.Red), new RectangleF(progressRect.X + 1, progressRect.Y + 1, float.Parse(percent.ToString()), progressRect.Height - 1)); 
 
                //绘制进度百分比  
                percent = fValue; 
                var percentText = string.Format("{0}% ...", percent); 
                if (fValue >= _progressMaximun) percentText = "已完成"; 
                var size = TextRenderer.MeasureText(percentText.ToString(), Font); 
                var x = rect.X + (progressRect.Width - size.Width) / 2.0; 
                var y = rect.Y + (progressRect.Height - size.Height) / 2.0 + 3; 
                g.DrawString(percentText, this.Font, new SolidBrush(Color.Black), float.Parse(x.ToString()), float.Parse(y.ToString())); 
            } 
            else 
            { 
                e.DrawDefault = true; 
            } 
            base.OnDrawSubItem(e); 
        } 
 
        public void SetProgress(int itemIndex, int value) 
        { 
            var columnWidth = this.Columns[ProgressColumnIndex].Width; 
            var progressSubItem = this.Items[itemIndex].SubItems[ProgressColumnIndex]; 
            progressSubItem.Text = value.ToString(); 
        } 
    } 
} 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace Control.Listview
{
    partial class ProgressListview
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Component Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
        }

        #endregion
    }

 


    public partial class ProgressListview : ListView
    {
        /// <summary>
        /// 进度条列索引
        /// </summary>
        private int _progressColumnIndex = -1;
        public int ProgressColumnIndex
        {
            get
            {
                return _progressColumnIndex;
            }
            set
            {
                _progressColumnIndex = value;
            }
        }

        /// <summary>
        /// 进度条最大值
        /// </summary>
        private int _progressMaximun = 100;
        public int ProgressMaximun
        {
            get
            {
                return _progressMaximun;
            }
        }

        public ProgressListview()
        {
            InitializeComponent();
        }

        public ProgressListview(IContainer container)
        {
            container.Add(this);
            InitializeComponent();
        }

        protected override void OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e)
        {
            e.DrawDefault = true;
            base.OnDrawColumnHeader(e);
        }


        protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e)
        {
            if (e.ColumnIndex == ProgressColumnIndex)
            {
                var item = e.Item.SubItems[1];
                var rect = item.Bounds;

                //绘制进度条
                var g = e.Graphics;
                var progressRect = new Rectangle(rect.X + 1, rect.Y + 3, rect.Width - 2, rect.Height - 5);
                g.DrawRectangle(new Pen(new SolidBrush(Color.Blue), 1), progressRect);

                //绘制进度
                var progressMaxWidth = progressRect.Width - 1;
补充:软件开发 , C# ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,