日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/1/17 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ProgressBar控件在Listview下的多线程应用(转自johngeng) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

.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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。