У меня проблема, которую я застрял целую вечность. Было бы здорово, что вы все можете помочь.
У меня есть список, который заполняется данными из моей базы данных при первой загрузке программ.
В моей программе у меня есть кнопка, которая "Обновляет" этот список, вытирая все данные из списка и запуская тот же метод, который заполняет список при загрузке программы. Однако эта кнопка обновления слишком длинная (около 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.
}
Я думаю, что это может произойти намного быстрее...
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. Это увеличит производительность приложений со многими элементами управления.