c#更新Listview耗时太长

本文关键字:更新 Listview | 更新日期: 2023-09-27 18:05:29

我有一个问题,我已经卡住了很长时间,希望大家都能帮助我。

我有一个listview,它在程序第一次加载时填充数据库中的数据。

在我的程序中,我有一个按钮,通过擦除列表视图中的所有数据并运行在程序加载时填充列表视图的相同方法来"刷新"此列表视图。然而,这个刷新按钮的刷新时间太长了(大约10秒)。

为什么程序可以在2秒内加载listview,但是当再次运行该方法时,它需要更长的时间。

请参阅我附上的代码,并建议任何更改,我为长度道歉。谢谢你。

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.
}

c#更新Listview耗时太长

我认为这可能会运行得更快…

    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.
    }

您可能需要在刷新之前执行SuspendLayout(),在填充完所有数据之后执行ResumeLayout()

当向父控件添加多个控件时,建议在初始化要添加的控件之前调用SuspendLayout方法。将控件添加到父控件后,调用ResumeLayout方法。这将提高具有许多控件的应用程序的性能。