日期:2014-05-18  浏览次数:21119 次

winform listview加载数据慢问题
这是查询代码,一共有4000行数据,但是查询时间需要20多秒。问一下如何优化这段代码,能在几秒内查出?

string query = "select ADsPath,sAMAccountName,displayName,miji from 'LDAP://" + Utils.GetCurrentDomain().Name + (!String.IsNullOrEmpty(this.tab1BoxOu.Text) ? ("/" + this.tab1BoxOu.Text) : "") + "' where objectCategory='user'";
   
  IDataReader dr = Utils.ExecuteAdQuery(query);
  try
  {
   
  while (dr.Read())
  {

  ListViewItem lvi = new ListViewItem(new string[] { 
  dr["sAMAccountName"].ToString(),
  dr["displayName"].ToString(),
  dr["miji"].ToString(),
  dr["ADsPath"].ToString()
  });
   
  listView1.Items.Add(lvi);

  }
  }

------解决方案--------------------
建议你使用DataSet,从数据库中读取的数据放入DataSet中,这样读得很快的
------解决方案--------------------
那就是你的查询耗时吧?
放到查询分析器中看看要多久? 如果时间长的话,就需要优化数据库了。
------解决方案--------------------
应该不是数据库查询耗时!耗时还是那段赋值过程.

改进办法;
1、改为DataGridView,用数据库直接绑定。
2、分页显示,比如每页显示100行记录。。。
------解决方案--------------------
如果不是查询慢的问题,看看listview的visualmode:
虚拟模式在许多情况下都很有用。 如果必须从已存在于内存中的非常大的集合填充一个 ListView 对象,则为每项创建一个 ListViewItem 对象会很浪费。 在虚拟模式下,从缓冲之中获取所需的数据进行加载,性能会有很大提高。 在其他情况下,可能需要经常重新计算 ListViewItem 对象的值,对整个集合进行此操作将产生不可接受的性能。

 

如下为虚拟模式的一个应用示例(仿VS2010错误列表),截图如下:



 

二、虚拟模式相关注意点

1、设置一个缓存属性,来保存需要加载的数据:

protected List<ListViewItem> CurrentCacheItemsSource
{
get;
private set;
}

 

2、通过虚拟模式来加载数据,如下:

private void LoadListViewItems(List<ListViewItem> items)
{
listView.Items.Clear();
if (items == null)
{
stripStatusInfo.Text = "当前总共记录数为:0";
return;
}

listView.GridLines = true;
listView.FullRowSelect = true;
listView.View = View.Details;
listView.Scrollable = true;
listView.MultiSelect = false;
listView.HeaderStyle = ColumnHeaderStyle.Clickable;
listView.Visible = true;

listView.VirtualListSize = items.Count;
listView.VirtualMode = true;
listView.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView_RetrieveVirtualItem);

stripStatusInfo.Text = "当前总共记录数为:" + items.Count;
}
 

listView.VirtualMode = true;//设置虚拟模式

listView.VirtualListSize = items.Count;//设置虚拟列表容量大小


listView.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView_RetrieveVirtualItem);//绑定虚拟操作

 

 

3、在RetrieveVirtualItem方法中加载相关的数据:

void listView_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
if (this.CurrentCacheItemsSource == null || this.CurrentCacheItemsSource.Count == 0)
{
return;
}

e.Item = this.CurrentCacheItemsSource[e.ItemIndex];
if (e.ItemIndex == this.CurrentCacheItemsSource.Count)