浏览绑定到datagridview的Datatable

时间:2016-07-18 10:34:29

标签: .net vb.net datagridview

请,我正在使用vb.net 2015,并且DataGridview绑定到DataTable,数据可以毫无问题地获取。

现在,如果返回的记录超过200,我想一次检索200,那么我将在DataGridView表单上设置下一个按钮,点击该按钮将加载DataGridView剩下的记录。

假设有一千条记录,第一次加载网格时,它将有200条记录,下一个按钮将被点击以显示另外200条记录等。

下面是绑定DataGridView的代码,但我不知道如何进行导航。

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

2 个答案:

答案 0 :(得分:1)

您描述它的方式 - 以200个为单位显示行 - 并没有真正保存任何内容,因为所有行仍然加载到DataTable。但是这可以使用DataView来完成,这样您就不必为每个组或页面集重新查询数据库。

' some form level variables:
Private page As Int32 
Private pageSize As Int32 
Private myView As DataView

然后,当您最初构建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)

然后,当您点击pageDataView按钮时,您需要递增或递减Next并重建Previous

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)

enter image description here

只有加载行的200套更经济,更容易。

答案 1 :(得分:0)

我没有VB.Net的经验。 所以,你可以阅读C#代码。

此示例构建如下:

您的计划将举办以下活动:

Load += Form1_Load;
nudNumber.ValueChanged+=nudNumber_ValueChanged;
cboPage.SelectedIndexChanged+=cboPage_SelectedIndexChanged;

要执行此操作的所有变量:

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");

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();
}

计算所有页面的功能。

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;
}

接下来,在页面数据中默认更改数字行时的事件:

private void nudNumber_ValueChanged(object sender, EventArgs e)
{
    pageSize = Convert.ToInt32(nudNumber.Value);
    pageTotal();
}

最后,当你在整个页面中选择任何页面时,事件。

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];
}
希望如此帮助你。