Please, I am using vb.net 2015, and I have a DataGridview
bound to a DataTable
and data can fetched without any problem.
Now, if the records returned are more than 200, I want to retrieve 200 at a time then I will have the next button on the DataGridView
form which will be clicked to load the DataGridView
for the remaining records.
So assuming there are a thousand records, the first time the grid loads, it will have 200 records and the next button will be clicked to display another 200 records, etc. before it finishes.
Below is the code that bounds the DataGridView but I don't know how to do the navigation.
Dim table As New DataTable
Dim com As SqlCommand
Dim QueryMailRefNo = "Select * from File_Movement where File_No=@File_No Order by fdate desc, ftime desc"
com = New SqlCommand(QueryMailRefNo, SQLCon)
com.Parameters.AddWithValue("File_No", frmHome.txtFileNo.Text)
daAdapter = New SqlDataAdapter(com)
daAdapter.Fill(table)
If table.Rows.Count > 200 Then
frmHome.dgvTracking.AutoGenerateColumns = False
frmHome.dgvTracking.DataSource = table
End If
Private Sub btnNext_Click(sender As Object, e As EventArgs) Handles btnNext.Click
End Sub
The way you describe it - showing rows in sets of 200 - doesn't really save anything because all the rows are still loaded to the DataTable
. But this can be done using a DataView
so that you do not have to requery the database for each group or page set.
' some form level variables:
Private page As Int32
Private pageSize As Int32
Private myView As DataView
Then when you initially build the DataTable:
...
daAdapter.Fill(table)
page = 0
pageSize = 200
myView = New DataView(dtSample.AsEnumerable().
Skip(page * pageSize).
Take(pageSize).CopyToDataTable())
dgv1.DataSource = myView
' any UI description:
lblRows.Text = String.Format("Rows {0} - {1} of {2}",
((page * pageSize) + 1),
(page + 1 * pageSize),
dtSample.Rows.Count)
Then you need to increment or decrement page
and rebuild the DataView
when they click Next
or Previous
buttons:
page += 1
dvSample = New DataView(dtSample.AsEnumerable().
Skip(page * pageSize).
Take(pageSize).
CopyToDataTable())
dgv1.DataSource = dvSample
lblRows.Text = String.Format("Rows {0:#,###} - {1:#,###} of {2}",
((page * pageSize) + 1),
((page + 1) * pageSize),
dtSample.Rows.Count)
Only loading rows in sets of 200 would be more economical and even a bit easier.
I don't have experience with VB.Net. So, you can read C# code.
This example build like this:
Your program will have Event like this:
Load += Form1_Load;
nudNumber.ValueChanged+=nudNumber_ValueChanged;
cboPage.SelectedIndexChanged+=cboPage_SelectedIndexChanged;
All variable to do this:
int currentPageIndex = 1;
int pageSize = 20;
int pageNumber = 0;
int fistRow, lastRow;
int rows;
SqlConnection QueryMailRefNo = new SqlConnection("Select * from File_Movement where File_No=@File_No Order by fdate desc, ftime desc");
Event when Form_Load():
void Form1_Load(object sender, EventArgs e)
{
string sql = "select count(*) as MaxNumber from File_Movement";
SqlCommand cmd = new SqlCommand(sql, QueryMailRefNo);
QueryMailRefNo.Open();
rows = Convert.ToInt32(cmd.ExecuteScalar());
pageTotal();
QueryMailRefNo.Close();
}
Function to count all page.
void pageTotal()
{
pageNumber = rows % pageSize != 0 ? rows / pageSize + 1 : rows / pageSize; // Count page if have pageSize in Page
lblTotal.Text = " / " + pageNumber.ToString();
cboPage.Items.Clear();
for (int i = 1; i < pageNumber; i++)
cboPage.Items.Add(i + "");
cboPage.SelectedIndex = 0;
}
Next, Event when change number rows default in a page data:
private void nudNumber_ValueChanged(object sender, EventArgs e)
{
pageSize = Convert.ToInt32(nudNumber.Value);
pageTotal();
}
Finally, Event when you select any page in total page.
void cboPage_SelectedIndexChanged(object sender, EventArgs e)
{
currentPageIndex = Convert.ToInt32(cboPage.Text);
fistRow = pageSize * (currentPageIndex - 1); // First rows
lastRow = pageSize * (currentPageIndex); //Final rows of page selected
string sql = "select Row_number() over(order by fdate) * from File_Movement";
SqlDataAdapter da = new SqlDataAdapter(sql, QueryMailRefNo);
DataSet ds = new DataSet();
da.Fill(ds, fistRow, pageSize, "ITSVT"); //Get data from firstRow and get pageSizeLấy of rows
dataGridView1.DataSource = ds.Tables[0];
}
Hope so help you.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.