2016-07-18 67 views
0

请,我使用vb.net 2015年,我有DataGridview绑定到DataTable和数据可以没有任何问题地提取。导航通过数据绑定到datagridview

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

因此,假设有一千条记录,当网格第一次加载时,它将有200条记录,下一个按钮将在点击完成之前显示另外200条记录等。

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

Dim table As New DataTable 
Dim com As SqlCommand 
Dim QueryMailRefNo = "Select * from File_Movement where [email protected]_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 

回答

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 [email protected]_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]; 
} 

希望所以帮助你。

1

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

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

然后,当你开始建立数据表:

... 
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) 

然后,你需要增加或减少page和重建DataView当他们点击NextPrevious按钮:

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套会更经济,甚至更容易一些。