Listview занимает слишком много времени, чтобы обновить C #

1

У меня проблема, которую я застрял целую вечность. Было бы здорово, что вы все можете помочь.

У меня есть список, который заполняется данными из моей базы данных при первой загрузке программ.

В моей программе у меня есть кнопка, которая "Обновляет" этот список, вытирая все данные из списка и запуская тот же метод, который заполняет список при загрузке программы. Однако эта кнопка обновления слишком длинная (около 10 секунд) для обновления.

Как получается, что программа может загружать за 2 секунды с заполнением списка, но при повторном запуске метода это займет гораздо больше времени.

Пожалуйста, см. Мой прилагаемый код и предложите любые изменения, я прошу прощения за длину. Спасибо.

public void AllHomeworkers()
{
    //This updates the homeworkers listview to contain all the records from the homeworkers table.

    listHomeworkersAll.BeginUpdate(); //This uses the begin update process on the listview, this is used to stop flickering
    listHomeworkersAll.Items.Clear(); //Clears all the items from the listview

    // this takes the datatable returned from AllHomeworkers stored procedure.
    // It then loops through the datatable adding every row to the list view.

    DataTable dtHomeworkers = _businessLayer.AllHomeworkers();
    for (int i = 0; i < dtHomeworkers.Rows.Count; i++)
    {
        DataRow drowHomeworkers = dtHomeworkers.Rows[i];

        if (drowHomeworkers.RowState != DataRowState.Deleted)
        {
            ListViewItem lvi = new ListViewItem(drowHomeworkers["StaffID"].ToString());
            lvi.SubItems.Add(drowHomeworkers["Title"].ToString());
            lvi.SubItems.Add(drowHomeworkers["Initials"].ToString());
            lvi.SubItems.Add(drowHomeworkers["Forename"].ToString());
            lvi.SubItems.Add(drowHomeworkers["Surname"].ToString());
            lvi.SubItems.Add(drowHomeworkers["Address"].ToString());
            lvi.SubItems.Add(drowHomeworkers["Address2"].ToString());
            lvi.SubItems.Add(drowHomeworkers["City"].ToString());
            lvi.SubItems.Add(drowHomeworkers["Postcode"].ToString());
            lvi.SubItems.Add(drowHomeworkers["CostCentre"].ToString());
            lvi.SubItems.Add(drowHomeworkers["Email"].ToString());
            lvi.SubItems.Add(drowHomeworkers["Telephone"].ToString());
            lvi.SubItems.Add(drowHomeworkers["Mobile"].ToString());
            lvi.SubItems.Add(drowHomeworkers["FMID"].ToString());
            lvi.SubItems.Add(drowHomeworkers["Comments"].ToString());
            lvi.SubItems.Add(drowHomeworkers["Leaver"].ToString());
            lvi.SubItems.Add(drowHomeworkers["LeavingDate"].ToString());
            lvi.SubItems.Add(drowHomeworkers["Base"].ToString());
            lvi.SubItems.Add(drowHomeworkers["NextVisit"].ToString());
            var deleted = drowHomeworkers["Deleted"].ToString();
            if (deleted != "")
            {
                lvi.ForeColor = Color.Red;
            }
            listHomeworkersAll.Items.Add(lvi);
        }
    }
    listHomeworkersAll.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);  
    // this sorts the columns to the size of the largest object stored inside them.

    listHomeworkersAll.EndUpdate();
    // this ends the listview update process.
}
Теги:
database
multithreading
listview

2 ответа

0
Лучший ответ

Я думаю, что это может произойти намного быстрее...

    public void AllHomeworkers()
    {

        //This updates the homeworkers listview to contain all the records from the homeworkers table.

        listHomeworkersAll.BeginUpdate(); //This uses the begin update process on the listview, this is used to stop flickering
        listHomeworkersAll.Items.Clear(); //Clears all the items from the listview

        // this takes the datatable returned from AllHomeworkers stored procedure.
        // It then loops through the datatable adding every row to the list view.

        DataTable dtHomeworkers = _businessLayer.AllHomeworkers();

        List<ListViewItem> listHomeworkers = new List<ListViewItem>();

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

            if (drowHomeworkers.RowState != DataRowState.Deleted)
            {
                ListViewItem lvi = new ListViewItem(drowHomeworkers["StaffID"].ToString());
                lvi.SubItems.Add(drowHomeworkers["Title"].ToString());
                lvi.SubItems.Add(drowHomeworkers["Initials"].ToString());
                lvi.SubItems.Add(drowHomeworkers["Forename"].ToString());
                lvi.SubItems.Add(drowHomeworkers["Surname"].ToString());
                lvi.SubItems.Add(drowHomeworkers["Address"].ToString());
                lvi.SubItems.Add(drowHomeworkers["Address2"].ToString());
                lvi.SubItems.Add(drowHomeworkers["City"].ToString());
                lvi.SubItems.Add(drowHomeworkers["Postcode"].ToString());
                lvi.SubItems.Add(drowHomeworkers["CostCentre"].ToString());
                lvi.SubItems.Add(drowHomeworkers["Email"].ToString());
                lvi.SubItems.Add(drowHomeworkers["Telephone"].ToString());
                lvi.SubItems.Add(drowHomeworkers["Mobile"].ToString());
                lvi.SubItems.Add(drowHomeworkers["FMID"].ToString());
                lvi.SubItems.Add(drowHomeworkers["Comments"].ToString());
                lvi.SubItems.Add(drowHomeworkers["Leaver"].ToString());
                lvi.SubItems.Add(drowHomeworkers["LeavingDate"].ToString());
                lvi.SubItems.Add(drowHomeworkers["Base"].ToString());
                lvi.SubItems.Add(drowHomeworkers["NextVisit"].ToString());
                var deleted = drowHomeworkers["Deleted"].ToString();
                if (deleted != "")
                {
                    lvi.ForeColor = Color.Red;
                }
                listHomeworkers.Add((ListViewItem)lvi);
            }
        }

        ListViewItem[] arr = listHomeworkers.ToArray();

        listHomeworkersAll.Items.AddRange(arr);

        listHomeworkersAll.EndUpdate();
        // this ends the listview update process.
    }
  • 1
    Спасибо!!! Теперь работает мгновенно. Я сделаю некоторые исследования в AddRange.
0

Вам может потребоваться SuspendLayout() перед обновлением и ResumeLayout() после того, как все данные будут заполнены.

При добавлении нескольких элементов управления в родительский элемент управления рекомендуется вызвать метод SuspendLayout до инициализации элементов управления, которые необходимо добавить. После добавления элементов управления к родительскому элементу управления вызовите метод ResumeLayout. Это увеличит производительность приложений со многими элементами управления.

  • 0
    Спасибо за ваш ответ, я попробовал это и, к сожалению, не повезло.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню