如何在Winforms中制作页面?

问题描述 投票:0回答:1

我想为 UserControl 制作页面,但我不知道如何做到这一点。

如何在 WinForms 中实现如图所示的功能?

我想在页面上显示过滤器中指示的尽可能多的卡片,但我不知道如何将剩余的卡片转移到下一页:

enter image description here

我的代码

private void button1_Click(object sender, EventArgs e)
{
    flowLayout.Controls.Clear();
    MySqlConnection sqlConnection = new MySqlConnection(connectionString);
    sqlConnection.Open();

    MySqlCommand cmd = new MySqlCommand(query, sqlConnection);

    try
    {
        using (MySqlDataAdapter sda = new MySqlDataAdapter(cmd))
        {
            DataTable dt = new DataTable();
            sda.Fill(dt);

            if (dt != null)
            {
                if (dt.Rows.Count > 0)
                {
                    ShopItem[] listItems = new ShopItem[dt.Rows.Count];
                    for (int i = 0; i < 1; i++)
                    {
                        foreach (DataRow row in dt.Rows)
                        {
                            listItems[i] = new ShopItem();
                            listItems[i].id = Convert.ToInt32(row["id_order"]);
                            listItems[i].brand = row["brand"].ToString();
                            listItems[i].capacity = row["capacity"].ToString();
                            listItems[i].engine = row["engine"].ToString();
                            listItems[i].lifting_height = row["lifting_height"].ToString();
                            listItems[i].mass = row["mass"].ToString();
                            MemoryStream ms = new MemoryStream((byte[])row["image"]);
                            Bitmap bitmap = new Bitmap(ms);
                            listItems[i]._image = bitmap;
                            listItems[i].price = row["price"].ToString();

                            //if select first value display one item
                            if (comboBoxFilter.SelectedIndex == 0)
                            {
                                if(flowLayout.Controls.Count < Convert.ToInt32(comboBoxFilter.SelectedItem))
                                {
                                    flowLayout.Controls.Add(listItems[i]);
                                }
                            }

                            //if select second value display four item
                            if (comboBoxFilter.SelectedIndex == 1)
                            {
                                if (flowLayout.Controls.Count < Convert.ToInt32(comboBoxFilter.SelectedItem))
                                {
                                    flowLayout.Controls.Add(listItems[i]);
                                }
                            }

                            //if select third value display nine item
                            if (comboBoxFilter.SelectedIndex == 2)
                            {
                                if (flowLayout.Controls.Count < Convert.ToInt32(comboBoxFilter.SelectedItem))
                                {
                                    flowLayout.Controls.Add(listItems[i]);
                                }
                            }
                        }
                    }
c# winforms pagination
1个回答
0
投票

假设您有一个

pageSize
和一个
page
值,您可以从
Rows
获取相应的块,如下所示:

for (int myIndex = page * pageSize; myIndex < (page + 1) * pageSize; myIndex++) {
    //Do some stuff with dt.Rows[i]
}

但是,最好不要从数据库中获取所有行,您可以将

query
修改为
limit
您的结果,您可以在任何 RDBMS 中执行此操作,但语法有所不同。如果您甚至无法从数据库中获取所有行,那么您可以像最初那样使用
row
循环,因为分页已经由查询完成。但是,如果您确实想在应用程序服务器上应用分页逻辑,正如您的问题标签所建议的那样,那么您可以按照上面的建议进行循环。

一般来说,最好限制 RDBMS 端的结果,这样您就不必在每个请求时用 n * 页行填充内存,而只需要 n x 少的行。因此,如果您没有充分的理由加载所有行,请在查询中进行限制。如果您有大数据,这尤其有用。

© www.soinside.com 2019 - 2024. All rights reserved.