2016-07-18 6 views
0

私はvb.net 2015を使用しています。DataGridviewDataTableにバインドされており、データは問題なくフェッチできます。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 [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個のセットで表示されても、実際には何も保存されません。しかし、これは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) 

次に、あなたは彼らがNextPreviousボタンをクリックしたときに増減pageをしてDataViewを再構築する必要があります。

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

ローディングローのセットは、より経済的で、少し簡単です。

関連する問題