현재 일부 사용자 지정 컨트롤을 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);
}
}
@JohnCarpenter 기본적으로 예. 모든 컨트롤을 클릭 할 수 있어야합니다. 클릭하면 해당 패널의 다른 모든 컨트롤과 클릭 한 컨트롤이 변경됩니다. 그렇게하는 것이 옳은 방법이 아닌가? 그것을위한 더 좋은 방법이 있습니까? – Backslash
어디에서 'Click' 이벤트 핸들러를 추가하고 있습니까? 왜 그것을 람다가 아닌 함수로 만들까요? 실수로 여러 번 이벤트 처리기를 추가하지 않는지 궁금합니다. –
나는'Debug.Writeline' 호출을 루프의 앞, 중간 및 후에 (타임 스탬프와 함께) 추가하여 호출 된 시점, 수행중인 작업의 양 및 완료 시점을 볼 수 있습니다. 예상보다 많은 상황이 발생할 수 있습니다. –