C# winform listview分頁(sql分頁)
自己正在做郵件系統遇到了的listview分頁功能的問題,來和大家分享下,話不多說,直接貼程式碼
下面是介面程式碼,
namespace Erp.PDM.MulMail { partial class TestPage { /// <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 Windows Form 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() { this.btnPrevPage = new System.Windows.Forms.Button(); this.btnNextPage = new System.Windows.Forms.Button(); this.listEmailUser = new System.Windows.Forms.ListView(); this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.SuspendLayout(); // // btnPrevPage // this.btnPrevPage.Location = new System.Drawing.Point(98, 281); this.btnPrevPage.Name = "btnPrevPage"; this.btnPrevPage.Size = new System.Drawing.Size(75, 23); this.btnPrevPage.TabIndex = 1; this.btnPrevPage.Text = "上一頁"; this.btnPrevPage.UseVisualStyleBackColor = true; this.btnPrevPage.Click += new System.EventHandler(this.btnPrevPage_Click); // // btnNextPage // this.btnNextPage.Location = new System.Drawing.Point(208, 280); this.btnNextPage.Name = "btnNextPage"; this.btnNextPage.Size = new System.Drawing.Size(75, 23); this.btnNextPage.TabIndex = 2; this.btnNextPage.Text = "下一頁"; this.btnNextPage.UseVisualStyleBackColor = true; this.btnNextPage.Click += new System.EventHandler(this.btnNextPage_Click); // // listEmailUser // this.listEmailUser.BackColor = System.Drawing.Color.White; this.listEmailUser.BorderStyle = System.Windows.Forms.BorderStyle.None; this.listEmailUser.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.columnHeader1, this.columnHeader2}); this.listEmailUser.Font = new System.Drawing.Font("宋體", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.listEmailUser.Location = new System.Drawing.Point(98, 43); this.listEmailUser.Name = "listEmailUser"; this.listEmailUser.Size = new System.Drawing.Size(185, 277); this.listEmailUser.TabIndex = 8; this.listEmailUser.UseCompatibleStateImageBehavior = false; this.listEmailUser.View = System.Windows.Forms.View.Details; // // columnHeader1 // this.columnHeader1.Text = "客戶、同事名稱或Email"; this.columnHeader1.Width = 260; // // columnHeader2 // this.columnHeader2.Text = "id"; this.columnHeader2.Width = 50; // // TestPage // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(421, 553); this.Controls.Add(this.btnNextPage); this.Controls.Add(this.btnPrevPage); this.Controls.Add(this.listEmailUser); this.Name = "TestPage"; this.Text = "TestPage"; this.Load += new System.EventHandler(this.TestPage_Load); this.ResumeLayout(false); } #endregion private System.Windows.Forms.Button btnPrevPage; private System.Windows.Forms.Button btnNextPage; private System.Windows.Forms.ListView listEmailUser; private System.Windows.Forms.ColumnHeader columnHeader1; private System.Windows.Forms.ColumnHeader columnHeader2; } }
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; using Erp.Library.Data.SqlClient; using System.Text.RegularExpressions; namespace Erp.PDM.MulMail { public partial class TestPage : Form { string sql; int totalcount = 0;//記錄總共的記錄數 static int page =0; //記錄現在翻到第幾頁了 public TestPage() { InitializeComponent(); } private ListViewItem lvi = null; private void TestPage_Load(object sender, EventArgs e) { //窗體載入的時候,前5條記錄是顯示的。這時候,“下一頁”是可用的,“上一頁”是不可用的。 string status = "3"; int count1 = GetCount(status); if (count1 > 50) { btnNextPage.Enabled = true; btnPrevPage.Enabled = false; } else { btnNextPage.Enabled = false; btnNextPage.Enabled = false; } string count = ""; using (DataAdapter da = new DataAdapter()) { DataTable dt = new DataTable(); sql = "SELECT top 50 linkman,customerno,[address],FAX,POSTCODE,COUNTRYID,PHONE,shortname,CompanyName , " + "(select name from bas_customerstyle where id=style) as style," + "(select name from bas_customerstatus where id=CustomerStatus ) as CustomerStatus," + "(select cnname from bas_region where id=Regionid ) as Region," + "(select cnname from bas_country where id=Countryid ) as Country," + "(select cnname from bas_province where id=Provinceid ) as Province," + "(select name from bas_customercredit where ID=CreditRateid) as CreditRate," + "(select name from bas_sysstatus where ID=sysstatus ) as sysstatus ," + "dbo.GetEmailAddress(a.id) as emailaddress ,(select COUNT(*) as ecount from E_EmailInfo where E_SendId =CAST(a.customerno as varchar(50)) and (E_ReplyId = '" + Erp.PDM.User.My.UID + "' or E_CCId = '" + Erp.PDM.User.My.UID + "') and IsRead = 'false' and SUBSTRING(E_EmailInfo.E_SendId,1,1) = 'C') as ecount" + " FROM crm_customer a where 1=1 and CustomerStatus ='" + status + "'" + " ORDER BY customerno"; //顯示前50條資訊 da.Text = sql; da.Fill(dt); for (int x = 0; x < dt.Rows.Count; x++) { count = dt.Rows[x][17].ToString(); if (count == "0") count = ""; else count = "(" + count + ")"; string name = dt.Rows[x][0].ToString() + count;// + dt.Rows[x][16].ToString() string emailAddress = dt.Rows[x][16].ToString(); if (name == "") { string[] emailList = Regex.Split(emailAddress, ",", RegexOptions.IgnoreCase); string email = emailList[0]; lvi = new ListViewItem(email); } else lvi = new ListViewItem(name); for (int k = 1; k < dt.Columns.Count; k++) { lvi.SubItems.Add(dt.Rows[x][k].ToString()); } this.listEmailUser.Items.Add(lvi); } this.listEmailUser.Items.Add(""); this.listEmailUser.Items.Add(""); } } /// <summary> /// 獲取客戶數量 /// </summary> /// <param name="status">潛在客戶、新客戶、老客戶</param> /// <returns></returns> private int GetCount(string status) { using (DataAdapter da = new DataAdapter()) { DataTable dt = new DataTable(); sql = "select count(customerno) from crm_customer where 1=1 and CustomerStatus ='" + status + "' "; da.Text = sql; da.Fill(dt); //檢視一共有多少條記錄。 totalcount = Convert.ToInt32(dt.Rows[0][0].ToString()); } return totalcount; } private void btnPrevPage_Click(object sender, EventArgs e) { //this.listEmailUser.Clear(); string status = "3"; //當點選下一頁時,上一頁是可用的。 //btnPrevPage.Enabled = true; //記錄有可能是被50整除的,有可能是不能被50整除,所以判斷下一頁是否可用需要分情況 if (totalcount % 50 == 0) { if (page >= totalcount / 50 - 2) { btnNextPage.Enabled = false; btnPrevPage.Enabled = true; } } else { if (page >= totalcount / 50 - 1) { btnNextPage.Enabled = false; btnPrevPage.Enabled = true; } } page = page - 1;//上一頁 if (page <= 0) { btnNextPage.Enabled = true; btnPrevPage.Enabled = false; } listEmailUser.Items.Clear();//清空上一頁的資料載入下一頁的資料 string count = ""; using (DataAdapter da = new DataAdapter()) { DataTable dt = new DataTable(); sql = "SELECT top 50 linkman,customerno,[address],FAX,POSTCODE,COUNTRYID,PHONE,shortname,CompanyName , " + "(select name from bas_customerstyle where id=style) as style," + "(select name from bas_customerstatus where id=CustomerStatus ) as CustomerStatus," + "(select cnname from bas_region where id=Regionid ) as Region," + "(select cnname from bas_country where id=Countryid ) as Country," + "(select cnname from bas_province where id=Provinceid ) as Province," + "(select name from bas_customercredit where ID=CreditRateid) as CreditRate," + "(select name from bas_sysstatus where ID=sysstatus ) as sysstatus ," + "dbo.GetEmailAddress(a.id) as emailaddress ,(select COUNT(*) as ecount from E_EmailInfo where E_SendId =CAST(a.customerno as varchar(50)) and (E_ReplyId = '" + Erp.PDM.User.My.UID + "' or E_CCId = '" + Erp.PDM.User.My.UID + "') and IsRead = 'false' and SUBSTRING(E_EmailInfo.E_SendId,1,1) = 'C') as ecount" + " FROM crm_customer a where 1=1 and CustomerStatus ='" + status + "'" + " and id NOT IN (SELECT TOP " + page * 50 + " id FROM crm_customer ORDER BY customerno) ORDER BY customerno"; //顯示前50條資訊 da.Text = sql; da.Fill(dt); for (int x = 0; x < dt.Rows.Count; x++) { count = dt.Rows[x][17].ToString(); if (count == "0") count = ""; else count = "(" + count + ")"; string name = dt.Rows[x][0].ToString() + count; string emailAddress = dt.Rows[x][16].ToString(); if (name == "") { string[] emailList = Regex.Split(emailAddress, ",", RegexOptions.IgnoreCase); string email = emailList[0]; lvi = new ListViewItem(email); } else lvi = new ListViewItem(name); for (int k = 1; k < dt.Columns.Count; k++) { lvi.SubItems.Add(dt.Rows[x][k].ToString()); } this.listEmailUser.Items.Add(lvi); } this.listEmailUser.Items.Add(""); this.listEmailUser.Items.Add(""); } } /// <summary> /// 下一頁 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnNextPage_Click(object sender, EventArgs e) { //this.listEmailUser.Clear(); string status = "3"; //當點選下一頁時,上一頁是可用的。 btnPrevPage.Enabled = true; //記錄有可能是被50整除的,有可能是不能被50整除,所以判斷下一頁是否可用需要分情況 if (totalcount % 50 == 0) { if (page >= totalcount / 50 - 2) { btnNextPage.Enabled = false; btnPrevPage.Enabled = true; } } else { if (page >= totalcount / 50 - 1) { btnNextPage.Enabled = false; btnPrevPage.Enabled = true; } } page = page + 1;//下一頁 listEmailUser.Items.Clear();//清空上一頁的資料載入下一頁的資料 string count = ""; using (DataAdapter da = new DataAdapter()) { DataTable dt = new DataTable(); sql = "SELECT top 50 linkman,customerno,[address],FAX,POSTCODE,COUNTRYID,PHONE,shortname,CompanyName , " + "(select name from bas_customerstyle where id=style) as style," + "(select name from bas_customerstatus where id=CustomerStatus ) as CustomerStatus," + "(select cnname from bas_region where id=Regionid ) as Region," + "(select cnname from bas_country where id=Countryid ) as Country," + "(select cnname from bas_province where id=Provinceid ) as Province," + "(select name from bas_customercredit where ID=CreditRateid) as CreditRate," + "(select name from bas_sysstatus where ID=sysstatus ) as sysstatus ," + "dbo.GetEmailAddress(a.id) as emailaddress ,(select COUNT(*) as ecount from E_EmailInfo where E_SendId =CAST(a.customerno as varchar(50)) and (E_ReplyId = '" + Erp.PDM.User.My.UID + "' or E_CCId = '" + Erp.PDM.User.My.UID + "') and IsRead = 'false' and SUBSTRING(E_EmailInfo.E_SendId,1,1) = 'C') as ecount" + " FROM crm_customer a where 1=1 and CustomerStatus ='" + status + "'" + " and id NOT IN (SELECT TOP " + page * 50 + " id FROM crm_customer ORDER BY customerno) ORDER BY customerno"; //顯示前50條資訊 da.Text = sql; da.Fill(dt); for (int x = 0; x < dt.Rows.Count; x++) { count = dt.Rows[x][17].ToString(); if (count == "0") count = ""; else count = "(" + count + ")"; string name = dt.Rows[x][0].ToString() + count; string emailAddress = dt.Rows[x][16].ToString(); if (name == "") { string[] emailList = Regex.Split(emailAddress, ",", RegexOptions.IgnoreCase); string email = emailList[0]; lvi = new ListViewItem(email); } else lvi = new ListViewItem(name); for (int k = 1; k < dt.Columns.Count; k++) { lvi.SubItems.Add(dt.Rows[x][k].ToString()); } this.listEmailUser.Items.Add(lvi); } this.listEmailUser.Items.Add(""); this.listEmailUser.Items.Add(""); } } } }