.Net 下ProgressBar控件可以让程序在加载数据时让用户知道目前的进度.诸如安装程序,加载数据到Listview中等.下面就以ProgressBar控件在Listview下的应用为例.

1.拖一个ProgressBar,一个ListView,一个Button到Winform中.我将ProgressBar命名为progBarReport,ListView命名为lvRentList,Button命名为btnSearch
2.界面部分(红色框部分为此例中用到的控件)

3.编辑代码部分
初始化ListView如:

private void initialListView()
{
            lvRentList.Columns.Add("租赁编号", 60);
            lvRentList.Columns.Add("会员编号", 60);
            lvRentList.Columns.Add("租赁金额", 70);
            lvRentList.Columns.Add("折扣率", 70);
            lvRentList.Columns.Add("总金额", 70);
            lvRentList.Columns.Add("租赁日期", 120);
            lvRentList.GridLines = true;
            lvRentList.View = View.Details;
            lvRentList.FullRowSelect = true;
        }

在申明部分创建个委托(delegate)

private delegate void dispProgStatus(string state);

用于更新ProgressBar的method.其中参数 state用于显示进度(当前及总共)

private void showProgStatus(string state)
{
string type = "";
if (progBarReport.InvokeRequired)
                progBarReport.Invoke(new dispProgStatus(showProgStatus), state);
else
{
                type = state.Substring(0, state.IndexOf("") + 2);
string[] data = state.Substring(state.IndexOf("") + 3).Split('/');
int current = 0;
                Int32.TryParse(data[0], out current);
int total = 0;
                Int32.TryParse(data[1], out total);
                progBarReport.Value = current;
                progBarReport.Maximum = total;
            }
if (lblProgStatus.InvokeRequired)
                lblProgStatus.Invoke(new dispProgStatus(showProgStatus), state);
else
                lblProgStatus.Text = state;
        }

载入数据到ListView中的method 其中参数DataTable dtRent是用于传递要载入到ListView中的数据

private void loadRentListView(DataTable dtRent,string state)
{
            lvRentList.Items.Clear();
            ArrayList memberList = new ArrayList();
decimal rentTotal = 0M;
            ArrayList itemList = new ArrayList();
string type = state.ToString();
ListViewItem[] rentItems = new ListViewItem[dtRent.Rows.Count]; //将用于整体插入ListView中可以大幅提高效率
for (int i = 0; i < dtRent.Rows.Count; i++)
{
if (i == dtRent.Rows.Count - 1)
                    type = "Loading Data Completed";
                state = type + (i + 1).ToString() + "/" + dtRent.Rows.Count.ToString();

int sessionID = 0;
                Int32.TryParse(dtRent.Rows[i].ItemArray.GetValue(0).ToString(), out sessionID);

int mid = 0;
                Int32.TryParse(dtRent.Rows[i].ItemArray.GetValue(1).ToString(), out mid);
if (!memberList.Contains(mid))
                    memberList.Add(mid);
                Decimal discount = 0M;
                Decimal.TryParse(dtRent.Rows[i].ItemArray.GetValue(3).ToString(), out discount);
                discount = Decimal.Round(discount * 100M, 2);
                Decimal total = 0M;
                Decimal.TryParse(dtRent.Rows[i].ItemArray.GetValue(4).ToString(), out total);
                rentTotal += total;
                DateTime rentDate = DateTime.Now;
                DateTime.TryParse(dtRent.Rows[i].ItemArray.GetValue(6).ToString(), out rentDate);

string[] items = { sessionID.ToString(), mid.ToString(), "$" + dtRent.Rows[i].ItemArray.GetValue(2).ToString(), "$" +discount.ToString() + "%"
                    , "$" + total.ToString(), rentDate.ToShortDateString() };
rentItems[i] = new ListViewItem(items) //将每条数据载入到ListViewItem中
showProgStatus(state.ToString()); //用于显示ProgressBar的进度
            }
lvRentList.Items.AddRange(rentItems); //批量插入数据到List View中,曾经试验过Add 比 AddRange的效率低百倍

            txtRentItemCount.Text = itemList.Count.ToString();
            txtRentMemberCount.Text = memberList.Count.ToString();
            txtRentFeeCount.Text = "$" + rentTotal.ToString();
        }

取出数据并调用载入数据到ListView的method其中参数object ThreadPool的静态method所要传递的参数,可以用来封装数据,未方便我基本用来传递进度

private void dispRentReport(object state)
{
            DateTime startDate = dtpStartDate.Value.Date;
            DateTime endDate = dtpEndDate.Value.Date.AddDays(1);
            Session mySession = new Session();
            dtRent = mySession.getSessionsByDate(startDate, endDate, 0);

            loadRentListView(dtRent,state.ToString());
        }

按钮btnSearch的click事件 点击按钮后即查找并将数据载入到ListView中

private void btnSearch_Click(object sender, EventArgs e)
{
            Console.WriteLine("Cat Index:" + comboSearchCat.SelectedIndex);
//Date Range
if (comboSearchCat.SelectedIndex == -1)
{
object state = "Loading Rent Data";
                ThreadPool.QueueUserWorkItem(dispRentReport, state);
            }
else
{
object state = "Loading Items under Category ";
                ThreadPool.QueueUserWorkItem(dispRentReportByCategory, state);
            }
            btnSearch.Enabled = false;
        }

运行结果如图: (图1 正在加载数据,并可以看到ListView中为空白.图2 显示数据加载完毕后才加载到ListView中)

(图1)

转载于:https://www.cnblogs.com/chongsenLi/archive/2009/04/23/1441768.html

ProgressBar控件在Listview下的多线程应用(转自johngeng)相关推荐

  1. 数据绑定控件之ListView

    一.绑定控件之ListView 在往下进行前我们下来讨论下Asp.net的特性,对于Asp.net微软为我们封装了众多的控件,将控件拖拽到页面上就可以使用控件进行编程,而且值得称道的是有些封装良好的控 ...

  2. WPF 给任意控件通过按下移动抬起封装点击事件

    其实点击这个事件是可以通过按下移动和抬起三个事件封装出来的,本文提供给大家一个辅助的方法,方便给任意的控件附加点击事件 在开始前需要了解一些本文点击的定义,本文点击的定义就是在按下到抬起过程中,不会出 ...

  3. vb.net 教程 3-4 窗体编程 公共控件9 ListView 1

    版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的. ListView:列表视图控件 使用ListView可以创建出类似于Windows资源管理器右侧 ...

  4. Android 数据显示控件(ListView实战演练)

    源码 [工程文件]:https://gitee.com/lwx001/ListView 推荐博客:(这个更详细.) https://blog.csdn.net/weixin_44949135/arti ...

  5. c#在WinForm中重写ProgressBar控件(带%的显示)

    c#在WinForm中重写ProgressBar控件(带%的显示) 2009-05-14 13:13 #region 定义textProgressBar控件的类 namespace csPublish ...

  6. Plupload控件在IE9下不能上传、文件尺寸为空、出现下载对话框问题解决

    问题: Plupload控件在IE10下运行良好,但在IE9下却不能上传,一点上传按钮,即出现下载对话框.而实际的返回数据为一堆正常的JSON数据. 有网友提过这个问题,他是这么提的:"使用 ...

  7. Adapter类型控件之ListView(列表控件)

    (一)概述 Android中的列表控件飞创灵活,可以自定义每一个列表项,实际上每一个列表项就是一个View,在Android定义了3个列表控件:ListView.ExpandableListView和 ...

  8. AlphaControls 控件 TsFrameBar 创建下拉式多级导航菜单

    AlphaControls 控件 TsFrameBar 创建下拉式多级导航菜单 TsFrameBar控件是创建一个下拉菜单的工具块.     TsFrameBar控件本身,可以通过创建TITEMS,自 ...

  9. Android ProgressBar控件

    1. ProgressBar类 ProgressBar用于显示进度条,进度条有两种不同的样式,选择和水平,通过设置style来区分. 旋转进度条,有大.中.小三种样式. style="?an ...

最新文章

  1. 五年之后的私有云和公有云会是什么样子
  2. Oracle中主键自增长
  3. Python之路(第十七篇)logging模块
  4. python123第七周小测验_python+request+untitest的接口自动化测试
  5. linux系统各种日志存储路径和详细介绍
  6. maven本地安装jar
  7. JAVA学习之网络编程UDP篇
  8. python unpack_Python使用struct处理二进制(pack和unpack用法)
  9. Spring 揭秘 12.1
  10. Java Web开发学习手册_Java Web实战开发完全学习手册
  11. 高通WCNSS驱动简析
  12. rtl驱动 ubuntu 禁用_Ubuntu如何安装rtl8822be驱动
  13. 复旦退休教授直播间吸烟被举报:此前因违规吸烟被学校要求做检讨
  14. HR模块-组织信息类型创建-PP01
  15. RGB, YUV及相关标准
  16. ant design vue日期组件怎么清空(a-range-picker,a-date-picker)
  17. 【NOIP】【codevs】【DP】1169传纸条
  18. 北京信息科技大学计算机研究生在哪个校区,北京信息科技大学有几个校区,哪个校区最好及各校区介绍...
  19. echarts 仪表盘
  20. 时延、丢包、抖动是什么?

热门文章

  1. oracle 自治数据库 培训,Oracle数据库掌门人,Andrew Mendelsohn 谈自治数据库
  2. oracle shell 登录,linux 本地账号密码无法登陆(shell可以登录),一直返回 登陆的login界面...
  3. 安卓模拟器运行python_利用python+Appium 之 如何在设备(模拟器)上自动安装并启动APP...
  4. xms和xmx为什么要相同_股民为什么要做股票配资?
  5. python中pickle模块的用法_Python中json模块和pickle模块的简单介绍(附示例)
  6. java 面试题三十三 子类父类方法执行顺序的问题
  7. Oracle就业课第四课之子程序
  8. Docker数据卷(Volume)
  9. 女主播还是女主播???
  10. Spring常见面试题