2012-08-13 95 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