2016-07-12 5 views
2

현재 일부 사용자 지정 컨트롤을 winforms의 패널에 추가하려고합니다. 모든 컨트롤이 도킹되어 "목록"과 같은 것을 만듭니다. 이제 모든 컨트롤을 선택/선택 취소하는 기능을 구현하려고합니다. 잘 작동하는 경우, 제 문제는 때로는 매우 느린 것 같습니다. 현재 ~ 50 개의 사용자 지정 컨트롤이 패널에 있습니다. 내가 그것을 다시 변경됩니다하지만 난 다시 클릭하기 전에 내가 두 번째처럼 기다릴 경우에만 작동 이잖아 클릭하여 두 번째에, 배경색을 변경합니다 컨트롤 중 하나를 클릭 할 때마다foreach 루프가 느린 것 같습니다.

modtable.Click += (s, e) => 
{ 
    foreach (Control m in pnl_ucMods.Controls) 
    { 
     if(m is ModTableEntry) 
     { 
      if(m != modtable) 
      { 
       ((ModTableEntry)m).BackColor = SystemColors.Control; 
      } 
      else if (m == modtable && m.BackColor == SystemColors.Control) 
       m.BackColor = SystemColors.ActiveCaption; 
      else 
       m.BackColor = SystemColors.Control; 
     } 
    } 
}; 

. 빨리 클릭하면 아무 일도 일어나지 않아 다시 클릭해야합니다. winforms에는 수많은 컨트롤이 포함되어 있지만 foreach는 모든 컨트롤을 루프 할 시간이 필요하다는 것을 이해합니다. 그러나 여기 누군가는 코드를 개선하고 어쩌면이 문제를 해결할 수있는 작은 아이디어를 가지고 있습니다.

TL; DR의 배경색을 변경됩니다 패널에서 사용자 정의 컨트롤 중 하나에

을 클릭합니다. 다른 모든 컨트롤은 클릭 된 컨트롤이 이미 선택되어있는 경우, 그것은 해제 너무 (해제) 배경색

변경됩니다

(선정).

편집 : 문제를 테스트하는 간단한 예입니다. 새 프로젝트를 만들고 코드를 추가하고 호출하면됩니다.

private void addPanels() 
{ 
    Panel newPanel = new Panel(); 
    newPanel.AutoScroll = true; 
    newPanel.Dock = DockStyle.Fill; 
    this.Controls.Add(newPanel); 

    for (int i = 0; i < 50; i++) 
    { 
     Panel childPanel = new Panel(); 
     childPanel.Size = new Size(100, 30); 
     childPanel.Dock = DockStyle.Top; 

     childPanel.Click += (s, e) => 
     { 
      foreach (Control p in newPanel.Controls) 
      { 
       if (p is Panel) 
       { 
        if (p != childPanel) 
         ((Panel)p).BackColor = SystemColors.Control; 
        else if (p == childPanel && p.BackColor == SystemColors.Control) 
         p.BackColor = SystemColors.ActiveCaption; 
        else 
         p.BackColor = SystemColors.Control; 
       } 
      } 
     }; 
     newPanel.Controls.Add(childPanel); 
    } 
} 
+0

@JohnCarpenter 기본적으로 예. 모든 컨트롤을 클릭 할 수 있어야합니다. 클릭하면 해당 패널의 다른 모든 컨트롤과 클릭 한 컨트롤이 변경됩니다. 그렇게하는 것이 옳은 방법이 아닌가? 그것을위한 더 좋은 방법이 있습니까? – Backslash

+0

어디에서 'Click' 이벤트 핸들러를 추가하고 있습니까? 왜 그것을 람다가 아닌 함수로 만들까요? 실수로 여러 번 이벤트 처리기를 추가하지 않는지 궁금합니다. –

+0

나는'Debug.Writeline' 호출을 루프의 앞, 중간 및 후에 (타임 스탬프와 함께) 추가하여 호출 된 시점, 수행중인 작업의 양 및 완료 시점을 볼 수 있습니다. 예상보다 많은 상황이 발생할 수 있습니다. –

답변

3

사용 MouseDown 이벤트 대신 Click 이벤트입니다.

너무 두 번 클릭하면 DoubleClick 이벤트가 발생하고 다른 Click 이벤트는 발생하지 않습니다.

귀하의 허락하에, Reza.

+0

나는 이유를 알지 못하지만 간단하지만 문제를 해결합니다. – Backslash

+0

나는 영어 원어민이 아니기 때문에 설명하기가 어렵다. 'Click' 이벤트는'MouseDown'과'MouseUp'의 두 이벤트로 구성됩니다. 따라서 자주 발생하지 않을 수 있습니다. –

+2

아마도이 사실을 답안에 추가하면 다음 독자에게 더 분명 해집니다. 너무 두 번 클릭하면 'DoubleClick' 이벤트가되고 다른 Click 이벤트는 발생하지 않습니다. –

관련 문제