2017-06-23 35 views
0

在我的Windows窗體應用程序中,我添加了一個SplitContainer控件。在SplitContainer的panel1中,我有一個ListBox,在SpliContainer的panel2中,我有兩個按鈕。在ListBox的鼠標移動上,我想選擇ListBox項目。下面是我的代碼來選擇列表框項目,如何恢復和最大化沒有閃爍和佈局重疊的表單?

private void ListBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
     int i; 
     this.SuspendLayout(); 
     for (i = 0; i < (this.listBox1.Items.Count); i++) 
     { 
      if (this.listBox1.GetItemRectangle(i).Contains(this.listBox1.PointToClient(MousePosition))) 
      { 
       this.listBox1.SelectedIndex = i; 
       return; 
      } 
     } 
     this.ResumeLayout(true); 
    } 

的SuspendLayout()和ResumeLayout()被稱爲以避免面板的重疊的形式加載時。

如果我恢復窗體,鼠標移動到列表框並再次最大化窗體然後SplitContainer panel2中的按鈕不能正確加載。如果我刪除掛起和ResumeLayout恢復和最大化工作正常。我提到這個 stackoverflow query link

ListBox不具有Resize和Dock屬性。所以我不應該調用SuspendLayout和ResumeLayout?任何人都會建議在哪裏使用SuspendLayout/ResumeLayout以及哪裏不是?

回答

0

試試這樣說:

private void ListBox1_MouseMove(object sender, MouseEventArgs e) 
{ 

    int newindex = ListBox1.IndexFromPoint(e.Location); 
    if (newindex != index) //avoid flickering 
    { 
     int i; 
     this.SuspendLayout(); 
     for (i = 0; i < (this.listBox1.Items.Count); i++) 
     { 
      if (this.listBox1.GetItemRectangle(i).Contains(this.listBox1.PointToClient(MousePosition))) 
      { 

       this.listBox1.SelectedIndex = i; 
       index = newindex; 
       //return; why return? 
      } 
     } 
     this.ResumeLayout(true); 
    } 
} 

剛剛宣佈指數爲全局變量。