Навигация по Datatable, привязанному к datagridview

.net vb.net datagridview

132 просмотра

2 ответа

16 Репутация автора

Пожалуйста, я использую 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
Автор: Benniit Источник Размещён: 18.07.2016 10:34

Ответы (2)


0 плюса

2550 Репутация автора

У меня нет опыта работы с 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];
}

Надеюсь, так поможет вам.

Автор: vanloc Размещён: 18.07.2016 10:56

1 плюс

35941 Репутация автора

То, как вы это описываете - показывать строки в наборах по 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)

Затем вам нужно увеличить или уменьшить pageи перестроить, DataViewкогда они нажимают 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)

введите описание изображения здесь

Только загрузка строк в наборах из 200 будет более экономичной и даже немного проще.

Автор: Ňɏssa Pøngjǣrdenlarp Размещён: 18.07.2016 01:56
Вопросы из категории :
32x32