简体   繁体   中英

Navigate through Datatable bound to datagridview

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM