블로그 이미지
따시쿵

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

2015. 5. 7. 11:22 C# with ListView

프로그램 설명


페이지 나누기가 있는 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;
                    }
            }


소스 파일 :

ListViewExample5.zip


posted by 따시쿵