C#의 윈폼으로 데이터를 다룰 때, 그리드 뷰를 많이 사용한다.
근데 그 데이터가 많이 있을 때 더 편리하게 보기 위해서 페이징 기능이 있으면 좋겠다.
DB는 SQLite를 사용했으며,
코드는 아래와 같다.
Form1.Designer.cs
namespace GridView_Paging
{
partial class Form1
{
/// <summary>
/// 필수 디자이너 변수입니다.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 사용 중인 모든 리소스를 정리합니다.
/// </summary>
/// <param name="disposing">관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form 디자이너에서 생성한 코드
/// <summary>
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마세요.
/// </summary>
private void InitializeComponent()
{
this.logGridView1 = new System.Windows.Forms.DataGridView();
this.label1 = new System.Windows.Forms.Label();
this.btnPre = new System.Windows.Forms.Button();
this.btnNext = new System.Windows.Forms.Button();
this.btn조회 = new System.Windows.Forms.Button();
this.btnFirst = new System.Windows.Forms.Button();
this.btnLast = new System.Windows.Forms.Button();
this.label2 = new System.Windows.Forms.Label();
this.txtPageSize = new System.Windows.Forms.TextBox();
((System.ComponentModel.ISupportInitialize)(this.logGridView1)).BeginInit();
this.SuspendLayout();
//
// logGridView1
//
this.logGridView1.AllowUserToAddRows = false;
this.logGridView1.AllowUserToDeleteRows = false;
this.logGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.logGridView1.Location = new System.Drawing.Point(10, 10);
this.logGridView1.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.logGridView1.Name = "logGridView1";
this.logGridView1.ReadOnly = true;
this.logGridView1.RowTemplate.Height = 27;
this.logGridView1.Size = new System.Drawing.Size(667, 370);
this.logGridView1.TabIndex = 0;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(296, 401);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(44, 12);
this.label1.TabIndex = 1;
this.label1.Text = "Page /";
//
// btnPre
//
this.btnPre.FlatAppearance.BorderSize = 0;
this.btnPre.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnPre.Location = new System.Drawing.Point(246, 394);
this.btnPre.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.btnPre.Name = "btnPre";
this.btnPre.Size = new System.Drawing.Size(38, 26);
this.btnPre.TabIndex = 2;
this.btnPre.Text = "<";
this.btnPre.UseVisualStyleBackColor = true;
this.btnPre.Click += new System.EventHandler(this.btnPre_Click);
//
// btnNext
//
this.btnNext.FlatAppearance.BorderSize = 0;
this.btnNext.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnNext.Location = new System.Drawing.Point(375, 394);
this.btnNext.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.btnNext.Name = "btnNext";
this.btnNext.Size = new System.Drawing.Size(38, 26);
this.btnNext.TabIndex = 4;
this.btnNext.Text = ">";
this.btnNext.UseVisualStyleBackColor = true;
this.btnNext.Click += new System.EventHandler(this.btnNext_Click);
//
// btn조회
//
this.btn조회.Location = new System.Drawing.Point(10, 394);
this.btn조회.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.btn조회.Name = "btn조회";
this.btn조회.Size = new System.Drawing.Size(88, 24);
this.btn조회.TabIndex = 5;
this.btn조회.Text = "조회";
this.btn조회.UseVisualStyleBackColor = true;
this.btn조회.Click += new System.EventHandler(this.btn조회_Click);
//
// btnFirst
//
this.btnFirst.FlatAppearance.BorderSize = 0;
this.btnFirst.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnFirst.Location = new System.Drawing.Point(203, 394);
this.btnFirst.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.btnFirst.Name = "btnFirst";
this.btnFirst.Size = new System.Drawing.Size(38, 26);
this.btnFirst.TabIndex = 7;
this.btnFirst.Text = "<<";
this.btnFirst.UseVisualStyleBackColor = true;
this.btnFirst.Click += new System.EventHandler(this.btnFirst_Click);
//
// btnLast
//
this.btnLast.FlatAppearance.BorderSize = 0;
this.btnLast.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.btnLast.Location = new System.Drawing.Point(419, 394);
this.btnLast.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.btnLast.Name = "btnLast";
this.btnLast.Size = new System.Drawing.Size(38, 26);
this.btnLast.TabIndex = 8;
this.btnLast.Text = ">>";
this.btnLast.UseVisualStyleBackColor = true;
this.btnLast.Click += new System.EventHandler(this.btnLast_Click);
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(541, 400);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(36, 12);
this.label2.TabIndex = 9;
this.label2.Text = "ROW:";
//
// txtPageSize
//
this.txtPageSize.Location = new System.Drawing.Point(588, 396);
this.txtPageSize.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.txtPageSize.Name = "txtPageSize";
this.txtPageSize.Size = new System.Drawing.Size(88, 21);
this.txtPageSize.TabIndex = 10;
this.txtPageSize.Text = "100";
this.txtPageSize.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(688, 428);
this.Controls.Add(this.txtPageSize);
this.Controls.Add(this.label2);
this.Controls.Add(this.btnLast);
this.Controls.Add(this.btnFirst);
this.Controls.Add(this.btn조회);
this.Controls.Add(this.btnNext);
this.Controls.Add(this.btnPre);
this.Controls.Add(this.label1);
this.Controls.Add(this.logGridView1);
this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.Name = "Form1";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Form1";
((System.ComponentModel.ISupportInitialize)(this.logGridView1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.DataGridView logGridView1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button btnPre;
private System.Windows.Forms.Button btnNext;
private System.Windows.Forms.Button btn조회;
private System.Windows.Forms.Button btnFirst;
private System.Windows.Forms.Button btnLast;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox txtPageSize;
}
}
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Data.SQLite;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace GridView_Paging
{
public partial class Form1 : Form
{
int PageCount;
int maxRec;
int pageSize;
int currentPage;
int recNo;
DataSet ds;
DataTable table = new DataTable();
SQLiteDataAdapter log_adapter;
public Form1()
{
InitializeComponent();
}
private void btn조회_Click(object sender, EventArgs e)
{
string connStr = @"UserPath\_.db"; // --- 임시용
try
{
using (var conn = new SQLiteConnection(connStr))
{
conn.Open();
string sql = "SELECT * FROM Table";
log_adapter = new SQLiteDataAdapter(sql, conn);
ds = new DataSet();
log_adapter.Fill(ds, "EventLogs");
table = ds.Tables["EventLogs"];
// Set the start and max records.
pageSize = Convert.ToInt32(txtPageSize.Text);
maxRec = table.Rows.Count;
PageCount = maxRec / pageSize;
//Adjust the page number if the last page contains a partial page.
if ((maxRec % pageSize) > 0)
{
PageCount += 1;
}
// Initial seeings
currentPage = 1;
recNo = 0;
// Display the content of the current page.
}
}
catch (Exception ex)
{
// 오류
}
LoadPage();
}
private void LoadPage()
{
int i;
int startRec;
int endRec;
DataTable dtTemp;
//Clone the source table to create a temporary table.
dtTemp = table.Clone();
if (currentPage == PageCount)
{
endRec = maxRec;
}
else
{
endRec = pageSize * currentPage;
}
startRec = recNo;
//Copy rows from the source table to fill the temporary table.
for (i = startRec; i < endRec; i++)
{
dtTemp.ImportRow(table.Rows[i]);
recNo += 1;
}
logGridView1.DataSource = dtTemp;
DisplayPageInfo();
}
private void DisplayPageInfo()
{
label1.Text = "Page " + currentPage.ToString() + "/ " + PageCount.ToString();
}
private bool CheckFillButton()
{
// Check if the user clicks the "Fill Grid" button.
if (pageSize == 0)
{
MessageBox.Show("Set the Page Size, and then click the Fill Grid button!");
return false;
}
else
{
return true;
}
}
private void btnFirst_Click(object sender, EventArgs e)
{
if (CheckFillButton() == false)
{
return;
}
//Check if you are already at the first page.
if (currentPage == 1)
{
MessageBox.Show("You are at the First Page!");
return;
}
currentPage = 1;
recNo = 0;
LoadPage();
}
private void btnNext_Click(object sender, EventArgs e)
{
//If the user did not click the "Fill Grid" button, then return.
if (CheckFillButton() == false)
{
return;
}
//Check if the user clicks the "Fill Grid" button.
if (pageSize == 0)
{
MessageBox.Show("Set the Page Size, and then click the Fill Grid button!");
return;
}
currentPage += 1;
if (currentPage > PageCount)
{
currentPage = PageCount;
//Check if you are already at the last page.
if (recNo == maxRec)
{
MessageBox.Show("You are at the Last Page!");
return;
}
}
LoadPage();
}
private void btnPre_Click(object sender, EventArgs e)
{
if (CheckFillButton() == false)
{
return;
}
if (currentPage == PageCount)
{
recNo = pageSize * (currentPage - 2);
}
currentPage -= 1;
//Check if you are already at the first page.
if (currentPage < 1)
{
MessageBox.Show("You are at the First Page!");
currentPage = 1;
return;
}
else
{
recNo = pageSize * (currentPage - 1);
}
LoadPage();
}
private void btnLast_Click(object sender, EventArgs e)
{
if (CheckFillButton() == false)
{
return;
}
//Check if you are already at the last page.
if (recNo == maxRec)
{
MessageBox.Show("You are at the Last Page!");
return;
}
currentPage = PageCount;
recNo = pageSize * (currentPage - 1);
LoadPage();
}
}
}
'프로그래밍 > C# (.net)' 카테고리의 다른 글
[C# .Net] DataView to DataSet (0) | 2020.09.29 |
---|---|
[C# .Net] 텍스트파일 쓰기 / 읽기 (0) | 2020.09.28 |
[C# .Net] Kakao API - 카카오 번역 (0) | 2020.09.28 |
[C# .Net] Naver API - 파파고 번역 (0) | 2020.09.28 |
[C# .Net] Google API - 구글 번역 (0) | 2020.09.28 |