2013-02-26 29 views
0

我有一個ListView約100項。我從過去選擇了一些項目,現在我需要向下滾動以查找其他項目,但在此期間 - 發生刷新,並且只會自動回滾到上次選擇的項目。如果ListView的位置發生改變,它不會自動滾動到選定的項目

是否有任何可能我如何關閉它或更好如果我目前正在滾動不滾動?

感謝響應:)

+0

如果你能找到BeginScroll/EndScroll事件,你可以堅持的BeginUpdate和EndUpdate在每個各自的方法。 – 2013-02-26 19:06:28

+0

@ofstream沒有BeginScroll/EndScroll既沒有名字上的滾動事件:/ – sczdavos 2013-02-26 19:08:55

+0

我想我們需要知道你在代碼中爲ListView刷新了什麼。處理這部分代碼可能有不同的方式。 – jross 2013-02-26 19:31:41

回答

0

我不知道這是否會幫助,但這裏沒有問題與新項目時添加和分類滾動回所選項目的設置。但是,我使用排序設置,不要調用排序或刷新。

創建一個新窗體並將ListView和一個Timer放在那裏。在ListView上只更改這些屬性。

  • 集查看到詳細
  • 點擊欄增加一列(調整寬度,使其寬)
  • 集排序,以升序
  • 設置啓用爲true
  • 設置間隔定時器2000(2秒)
  • 雙擊Tick事件創建一個處理程序

現在添加以下代碼

public Form1() 
{ 
    InitializeComponent(); 

    for (int x = 0; x < 100; x++) 
    { 
     listView1.Items.Add("Item #" + x); 
    } 
} 

private int y = 10; 
private void timer1_Tick(object sender, EventArgs e) 
{ 
    listView1.Items.Add("Item #" + y + "b"); 
    y += 10; 
} 

現在,當你運行這個你可以選擇任何項目,任何地方滾動時增加了一個新的項目也不會跳回到選定的項目。但是,如果它添加的項目在上面,它會向下滾動一行...

也許這會讓您足夠接近,以至於您可以進一步使用它以獲得所需內容。

但是,這是最好的我可以做w/o進入分類ListView控件使用Win32 API以某種方式。

0

這是一種迂迴的解決方案(可能有點晚),但它似乎工作。 我在最近添加的項目上使用EnsureVisible()以實現自動滾動,這是在timer1_Tick方法中調用的。但是我使用了一個「檢查列表」標記,當你點擊一個列表項時,這個標記將不會發生自動滾動。當焦點離開列表視圖時,滾動繼續正常進行。

解決方案的

部分是什麼jross說到做到,這是創建一個虛擬的形式來進行測試:

private void Form1_Load(object sender, EventArgs e) 
    { 
     listView1.Columns.Add("Scroll Control", 100); 

     for(int i = 0; i < 100; i++) 
     { 
      listView1.Items.Add(string.Format("Item #{0:000}", i)); 
     } 

     timer1.Interval = 1000; 
     timer1.Start(); 
    } 

    private int newItem = 10; 
    private bool inspectingList = false; 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     listView1.Items.Add(string.Format("Item #{0:000}", newItem)); 
     newItem += 10; 

     if (!inspectingList) 
     { 
      listView1.Items[listView1.Items.Count - 1].EnsureVisible(); 
     } 
     listView1.Refresh(); 
    } 

    private void listView1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     inspectingList = true; 
     if (listView1.SelectedIndices.Count > 0) 
     { 
      listView1.Items[listView1.SelectedIndices[0]].EnsureVisible(); 
     } 
    } 

    private void listView1_Leave(object sender, EventArgs e) 
    { 
     inspectingList = false; 
    } 
相關問題