프로그램 설명
페이지 나누기가 있는 ListView 예제입니다.
기본적인 아이디어는 Listview Paging in C# 에 있는 자료를 가져다가 사용했으며, 몇가지 성능을 위해서 수정한 부분이 있습니다.
수정한 부분
1. 데이타 쿼리는 폼이 로드될 시에 전체적으로 한번만 데이타베이스에서 가져오고 그 다음 페이지 이동시에는 처음 로드한 데이타셋에서 자료를 가져옵니다.
2. 하단에 있는 처음으로, 이전으로, 다음으로, 마지막으로 버튼 이벤트를 한 곳으로 모아서 처리했습니다.
3. 컬럼 이벤트를 주어서 sorting 기능도 추가했습니다. (ascending, descending)
실행 후
프로그램 작성 순서
1. 페이지 나누기 기본 알고리즘
static void Main(string[] args) { int TotalRec, NRPP; double TotalPages = 0; String p; System.Console.WriteLine("Enter Total Records"); TotalRec = Convert.ToInt32(System.Console.ReadLine()); //Getting value to set number records are shown in the page. System.Console.WriteLine("Enter No. of Records Per Page"); NRPP = Convert.ToInt32(System.Console.ReadLine()); //calculating Total Pages TotalPages = Math.Ceiling( Convert.ToDouble(TotalRec) / NRPP); System.Console.WriteLine("The Total Pages:{0}", TotalPages); //Creating Page Indexes int i, j; for (int k = 1; k <= TotalPages; k++) { System.Console.WriteLine("\n\n Page No:{0} \n", k); i = (k - 1) * NRPP; int start = i; int end = 0; j = k * NRPP; for (; i < j; i++) { if (i >= TotalRec) { break; } System.Console.WriteLine("Record Index:{0}", i); end = i; } System.Console.WriteLine("Records Showing From {0} to {1}", (start + 1), (end + 1)); System.Console.WriteLine("*****End of Page***** \n"); p = System.Console.ReadLine(); } }
2. 전역 변수들
public class LsvPageGlobVar { public static string ConStr; public static DataTable sqlDataTable = new DataTable(); public static int TotalRec; //Variable for getting Total Records of the Table public static int NRPP; //Variable for Setting the Number of Recrods per listiview page public static int Page; //List View Page for Navigate or move public static double TotalPages; //Varibale for Counting Total Pages. public static int RecStart; //Variable for Getting Every Page Starting Record Index public static int RecEnd; //Variable for Getting Every Page End Record Index }
3. 페이지별로 데이타 가져오는 method
public class LsvPageFunc { public static void FillLsvData(BindingList<contacts> sqlData, ListView lvList, int imageID) { lvList.Items.Clear(); // total record count LsvPageGlobVar.TotalRec = sqlData.Count; // calculate total page count LsvPageGlobVar.TotalPages = Math.Ceiling(Convert.ToDouble(LsvPageGlobVar.TotalRec) / LsvPageGlobVar.NRPP); //for adding records to the listview from datatable int l, k; l = (LsvPageGlobVar.Page - 1) * LsvPageGlobVar.NRPP; k = ((LsvPageGlobVar.Page) * LsvPageGlobVar.NRPP); LsvPageGlobVar.RecStart = l + 1; if (k > LsvPageGlobVar.TotalRec) { LsvPageGlobVar.RecEnd = LsvPageGlobVar.TotalRec; } else { LsvPageGlobVar.RecEnd = k; } int index = 0; for (; l < k; l++) { if (l >= LsvPageGlobVar.TotalRec) { break; } // Not display image //ListViewItem item = new ListViewItem(); //item.Text = sqlData[l].Idx.ToString(); //item.SubItems.Add(sqlData[l].Name); //item.SubItems.Add(sqlData[l].BirthInfo); //item.SubItems.Add(sqlData[l].ZipCode); //item.SubItems.Add(sqlData[l].Address); //item.SubItems.Add(sqlData[l].HomeTelephone); //item.SubItems.Add(sqlData[l].CompanyTelephone); //item.SubItems.Add(sqlData[l].Mobile); //item.SubItems.Add(sqlData[l].Company); //item.SubItems.Add(sqlData[l].RegDate); //lvList.Items.Add(item); // Display image lvList.Items.Add(sqlData[l].Idx.ToString(), imageID); lvList.Items[index].SubItems.Add(sqlData[l].Name); lvList.Items[index].SubItems.Add(sqlData[l].BirthInfo); lvList.Items[index].SubItems.Add(sqlData[l].ZipCode); lvList.Items[index].SubItems.Add(sqlData[l].Address); lvList.Items[index].SubItems.Add(sqlData[l].HomeTelephone); lvList.Items[index].SubItems.Add(sqlData[l].CompanyTelephone); lvList.Items[index].SubItems.Add(sqlData[l].Mobile); lvList.Items[index].SubItems.Add(sqlData[l].Company); lvList.Items[index].SubItems.Add(sqlData[l].RegDate); index++; } } }
4. 실제적으로 페이지별로 데이타 호출하는 방법
Button button = (Button)sender; switch(button.Name) { case "btnFirst": { LsvPageGlobVar.Page = 1; LsvPageFunc.FillLsvData(ContactList, lsvData, 0); lblInfo.Text = "Record Shown: " + LsvPageGlobVar.RecStart + " to " + LsvPageGlobVar.RecEnd + " Page " + LsvPageGlobVar.Page + " of " + LsvPageGlobVar.TotalPages; break; } case "btnPrev": { if (LsvPageGlobVar.Page > 1) { LsvPageGlobVar.Page--; } LsvPageFunc.FillLsvData(ContactList, lsvData, 1); lblInfo.Text = "Record Shown: " + LsvPageGlobVar.RecStart + " to " + LsvPageGlobVar.RecEnd + " Page " + LsvPageGlobVar.Page + " of " + LsvPageGlobVar.TotalPages; break; } case "btnNext": { if (LsvPageGlobVar.Page < LsvPageGlobVar.TotalPages) { LsvPageGlobVar.Page++; } LsvPageFunc.FillLsvData(ContactList, lsvData, 2); lblInfo.Text = "Record Shown: " + LsvPageGlobVar.RecStart + " to " + LsvPageGlobVar.RecEnd + " Page " + LsvPageGlobVar.Page + " of " + LsvPageGlobVar.TotalPages; break; } case "btnLast": { LsvPageGlobVar.Page = Convert.ToInt32(LsvPageGlobVar.TotalPages); LsvPageFunc.FillLsvData(ContactList, lsvData, 3); lblInfo.Text = "Record Shown: " + LsvPageGlobVar.RecStart + " to " + LsvPageGlobVar.RecEnd + " Page " + LsvPageGlobVar.Page + " of " + LsvPageGlobVar.TotalPages; break; } }
소스 파일 :
'C# with ListView' 카테고리의 다른 글
Column Sorting 이 있는 ListView (0) | 2015.04.30 |
---|---|
데이타베이스 4칙 연산(select, insert, delete, update) (0) | 2015.04.28 |