Как загрузить данные в Flowlayout на основе прокрутки в C # (Проблема: Flowlayout Freeze) - PullRequest
0 голосов
/ 15 марта 2019

Мне нужно загрузить большое количество данных о растениях в схеме потока, когда я выбираю категорию данных, Если я выберу категорию с более чем 12000 данных, потребуется больше времени для загрузить данные в потоковое планирование, поэтому мне нужно загрузить данные на основе прокрутки потока.


protected void category_Click(object sender, EventArgs e)
    {
        Button category = sender as Button;
        string s;
        s = " ID: ";
        s += category.Tag;
        s += "\n Name: ";
        s += category.Name.ToString();
        PlantList_with_images(category.Tag.ToString());
    }

Выше код помогает генерировать все категории в виде кнопки, пока я нажимаю на категорию, тогда данные, относящиеся к этой конкретной категории, должны быть загружены во второй поток

 public void PlantList_with_images(string value)
    {
        flowLayoutPanelPlantList.Controls.Clear();
        try
        {
            string expression;
            string sql;
            expression= " select [id],[code],[name] from [plantdetails] where categoryname ='" + value + "'";
            Datatable dt = DataAccess.GetTable(sqlfetcher);
            int currentImage = 0;

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                DataRow dataReader = dt.Rows[i];

                Button b = new Button();
                b.Tag = dataReader["name"].ToString();
                b.Click += new EventHandler(b_Click_Plant);

                string details = dataReader["code"].ToString() +
                "\n Name: " + dataReader["name"].ToString();

                b.Name = details;

                ImageList il = new ImageList();
                il.ColorDepth = ColorDepth.Depth32Bit;
                il.TransparentColor = Color.Transparent;
                il.ImageSize = new Size(58, 60);
                il.Images.Add(Image.FromFile(img_directory + dataReader["imagename"]));

                b.Image = il.Images[0];
                b.Margin = new Padding(0, 0, 0, 0);

                b.Size = new Size(190, 83);
                //b.Text.PadRight(4);

                b.Text += dataReader["code"].ToString();
                b.Text += "\n" + dataReader["name"].ToString();

                b.Font = new Font("Arial", 8, FontStyle.Bold, GraphicsUnit.Point);
                b.TextAlign = ContentAlignment.MiddleLeft;
                b.TextImageRelation = TextImageRelation.ImageBeforeText;
                flowLayoutPanelPlantList.Controls.Add(b);
                currentImage++;

            }
        }
        catch //(Exception)
        {
        }
    }

Приведенный выше код помогает загружать данные в поток данных, проблема в том, что, если я нажимаю на категорию с более чем 1000 или 2000 или более данными о заводе, она зависает и занимает больше времени для загрузки данных, иногда показывает, что не отвечает, Пожалуйста, помогите мне решить эту проблему

1 Ответ

0 голосов
/ 18 марта 2019

Заполнение ваших элементов управления должно быть сделано в его собственном потоке, чтобы не блокировать поток GUI. Когда вы добавляете свои элементы управления, добавляйте их все сразу, а не по одному, потому что каждое добавление является блоком (не отвечающим) в потоке GUI. При добавлении элементов управления вы по-прежнему не отвечаете, но это должно быть меньше ожидания.

        public void PlantList_with_images(string value)
        {
            flowLayoutPanelPlantList.Controls.Clear();

            //Create a task to gather your controls. 
            //Inside of a task the UI will still continue to respond when gathering your controls
            //Change it from add 1 control at a time to AddRange after you have gathered your controls
            flowLayoutPanelPlantList.Controls.AddRange(Task.Run(() =>
            {
                List<Button> controlList = new List<Button>();

                try
                {                    
                    string expression;
                    string sql;
                    expression = " select [id],[code],[name] from [plantdetails] where categoryname ='" + value + "'";
                    Datatable dt = DataAccess.GetTable(sqlfetcher);
                    int currentImage = 0;

                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        DataRow dataReader = dt.Rows[i];

                        Button b = new Button();
                        b.Tag = dataReader["name"].ToString();
                        b.Click += new EventHandler(b_Click_Plant);

                        string details = dataReader["code"].ToString() +
                        "\n Name: " + dataReader["name"].ToString();

                        b.Name = details;

                        ImageList il = new ImageList();
                        il.ColorDepth = ColorDepth.Depth32Bit;
                        il.TransparentColor = Color.Transparent;
                        il.ImageSize = new Size(58, 60);
                        il.Images.Add(Image.FromFile(img_directory + dataReader["imagename"]));

                        b.Image = il.Images[0];
                        b.Margin = new Padding(0, 0, 0, 0);

                        b.Size = new Size(190, 83);
                        //b.Text.PadRight(4);

                        b.Text += dataReader["code"].ToString();
                        b.Text += "\n" + dataReader["name"].ToString();

                        b.Font = new Font("Arial", 8, FontStyle.Bold, GraphicsUnit.Point);
                        b.TextAlign = ContentAlignment.MiddleLeft;
                        b.TextImageRelation = TextImageRelation.ImageBeforeText;
                        //flowLayoutPanelPlantList.Controls.Add(b);
                        controlList.Add(b);
                        currentImage++;

                    }
                }
                catch //(Exception)
                {
                }

                //Return the list of controls
                return controlList;
                //When you return the controls you will get a pause when adding all the controls to the flowcontainer it is unavoidable.
            }));
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...