2012-08-13 98 views
0

我正在用SQL中的两个数据集填充ListView。这每15秒发生一次。我怎样才能保持滚动的位置,并仍然刷新数据?我在这里看到了一些有关相关问题的问题,但没有一个真正解决我的具体问题我已经尝试了有限的成功TopMost选项。刷新后的'ListView'位置

关于如何保持滚动位置的任何建议?以下是我用来填充ListBox的数据的一些代码。

private void PopulateData() 
{   
    _agent.Stop(); 
    listView1.Items.Clear(); 
    listView1.Groups.Clear(); 
    listView1.BeginUpdate(); 
    string filter; 

    DataTable dt1 = new DataTable(); 
    DataTable dt2 = new DataTable(); 

    dt1.Columns.Add("Name", typeof(string)); 
    dt1.Columns.Add("Status", typeof(string)); 
    dt1.Columns.Add("Time", typeof(double)); 
    dt1.Columns.Add("Calls", typeof(double)); 
    dt1.Columns.Add("InProgress", typeof(double)); 
    dt1.Columns.Add("Region", typeof(string)); 

    dt2.Columns.Add("Name", typeof(string)); 
    dt2.Columns.Add("CChats", typeof(double)); 
    dt2.Columns.Add("AChats", typeof(double)); 

    foreach (DataRow dr in _agentStates.Rows) 
    { 
     DataRow row = dt1.NewRow(); 
     row["Name"] = dr[0].ToString(); 
     row["Status"] = dr[1].ToString(); 
     row["Time"] = Convert.ToDouble(dr[2].ToString()); 
     row["Calls"] = Convert.ToDouble(dr[3].ToString()); 
     row["InProgress"] = Convert.ToDouble(dr[4].ToString()); 
     row["Region"] = dr[5].ToString(); 
     dt1.Rows.Add(row); 
    } 

    foreach (DataRow dr in _chatCount.Rows) 
    { 
     DataRow row = dt2.NewRow(); 
     row["Name"] = dr[0].ToString(); 
     row["CChats"] = Convert.ToDouble(dr[1].ToString()); 
     row["AChats"] = Convert.ToDouble(dr[2].ToString()); 
     dt2.Rows.Add(row); 

    } 

    var result = from table1 in dt1.AsEnumerable() 
       join table2 in dt2.AsEnumerable() 
       on (string)table1["Name"] equals (string)table2["Name"] 
       into joinedDt 
       from table2 in joinedDt.DefaultIfEmpty() 
       select new 
       { 
        Name = (string)table1["Name"], 
        Status = (string)table1["Status"], 
        Time = (double)table1["Time"], 
        Calls = (double)table1["Calls"], 
        InProgress = (double)table1["InProgress"], 
        Region = (string)table1["Region"], 
        CChats = (table2 != null ? (double)table2["CChats"] : 0), 
        AChats = (table2 != null ? (double)table2["AChats"] : 0) 
       }; 

    foreach (var item in result) 
    { 
     if (item.Status != "NLO" && item.Status !="Webchat Account") 
     { 
      var calls = item.Calls + item.CChats; 
      var lvi = new ListViewItem(item.Name); 
      lvi.SubItems.Add(item.Status); 
      lvi.SubItems.Add(Conv.Time(item.Time)); 
      lvi.SubItems.Add(item.Calls.ToString()); 
      lvi.SubItems.Add(item.CChats.ToString()); 
      lvi.SubItems.Add((item.AChats + item.InProgress).ToString()); 
      lvi.SubItems.Add(calls.ToString()); 
      this.listView1.Items.Add(lvi); 
     } 
    } 

    listView1.EndUpdate(); 
    _agent.Start(); 
} 
+0

是页面也越来越每15秒刷新? – Rondel 2012-08-13 20:45:37

回答

2

使用ListView在VirtualMode模式和实施RetrieveVirtualItem event

它可以让您更好地控制可见内容,而且您不需要清除所有项目即可更新内容。

如果VirtualMode设置为true,则只需将VirtualListSize设置为要在列表中显示的项目数。 RetrieveVirtualItem事件将为列表视图要显示给用户的每个项目触发。因此,如果您的数据发生变化,您可以调用列表视图的Refresh方法,并且您的RetrieveVirtualItem处理程序将返回新的项目数据。

考虑这个例子:

public partial class Form1 : Form 
{ 
    private int i = 0; 

    public Form1() 
    { 
     InitializeComponent(); 
     listView1.View = View.Details; 
     listView1.Columns.Add("Col", 250); 
     listView1.VirtualMode = true; 
     listView1.RetrieveVirtualItem += listView1_RetrieveVirtualItem; 
     listView1.VirtualListSize = 25; 
     button1.Click += button1_Click; 
    } 

    private void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e) 
    { 
     e.Item = new ListViewItem((i + e.ItemIndex).ToString()); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     // simulate data update 
     i += 10; 
     //listView1.VirtualListSize += 5; // you can even change the virtual list size while keeping current scroll position 
     listView1.Refresh(); 
    } 
} 
+0

我在帖子中添加了一些代码。我大部分时间都有一个变量列表,当我尝试你的代码时,我得到了25行似乎是静态的相同数据。 – 2012-08-14 18:42:24

+0

你有地址并点击button1吗? – 2012-08-14 20:29:48