2017-06-23 60 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); 
    } 
} 

刚刚宣布指数为全局变量。