2016-07-18 115 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套會更經濟,甚至更容易一些。