배경 해고 누가 결정 : 내 윈폼 양식에서이벤트
을, 나는 검사 ListView를 및 checkBoxAll라는 "마스터"체크 박스가 있습니다. 다음과 같이 마스터의 동작은 다음과 같습니다 마스터가 선택 또는 선택되어
경우, 모든 ListViewItems에 따라 변경해야합니다.
사용자가 ListViewItem의 선택을 취소하면 그에 따라 마스터를 변경해야합니다.
사용자가 ListViewItem을 검사하고 다른 모든 ListViewItem도 검사하면 그에 따라 마스터를 변경해야합니다. 내가이 동작을 모방하려면 다음 코드를 작성했습니다
:
private bool byProgram = false; //Flag to determine the caller of the code. True for program, false for user.
private void checkBoxAll_CheckedChanged(object sender, EventArgs e)
{
//Check if the user raised this event.
if (!byProgram)
{
//Event was raised by user!
//If checkBoxAll is checked, all listviewitems must be checked too and vice versa.
//Check if there are any items to (un)check.
if (myListView.Items.Count > 0)
{
byProgram = true; //Raise flag.
//(Un)check every item.
foreach (ListViewItem lvi in myListView.Items)
{
lvi.Checked = checkBoxAll.Checked;
}
byProgram = false; //Lower flag.
}
}
}
private void myListView_ItemChecked(object sender, ItemCheckedEventArgs e)
{
//Get the appropiate ListView that raised this event
var listView = sender as ListView;
//Check if the user raised this event.
if (!byProgram)
{
//Event was raised by user!
//If all items are checked, set checkBoxAll checked, else: uncheck him!
bool allChecked = true; //This boolean will be used to set the value of checkBoxAll
//This event was raised by an ListViewItem so we don't have to check if any exist.
//Check all items untill one is not checked.
foreach (ListViewItem lvi in listView.Items)
{
allChecked = lvi.Checked;
if (!allChecked) break;
}
byProgram = true; //Raise flag.
//Set the checkBoxAll according to the value determined for allChecked.
checkBoxAll.Checked = allChecked;
byProgram = false; //Lower flag.
}
}
이 예에서는, 나는 확실히 이벤트가 사용자에 의해 여부 기인했다을 만들기 위해 플래그 (byProgram)를 사용 무한 루프 (하나의 이벤트가 다른 이벤트를 발사하여 첫 번째 이벤트를 다시 실행할 수있는 등)를 방지합니다. IMHO, 이것은 해킹 된 솔루션입니다. 나는 주위를 검색했지만 사용자 컨트롤 이벤트가 사용자의 도움으로 직접 실행되었는지 확인하기 위해 MSDN 문서화 된 메서드를 찾을 수 없습니다. 이상하게 여겨지는 (다시, IMHO).
FormClosingEventArgs에는 사용자가 양식을 닫는 지 여부를 결정하는 데 사용할 수있는 필드가 있습니다.
이벤트가 있다면 결정하기 위해 (내 예) 이외의 다른 방법이 :하지만 내가 아는 한, 그 기능이 종류를 제공하는 유일한 EventArg ... 요약 그래서
입니다 사용자가 직접 해고 했나요?
참고 : 나는 이벤트의 발신자가 아닙니다. 내가 someCheckBox.Checked = true를 코딩하면 상관 없습니다. 또는 someCheckBox를 수동으로 설정하면 이벤트 발신자는 항상 someCheckBox가됩니다. 나는 그것이 사용자 (클릭) 또는 프로그램 (.Checked = true)에 의한 것인지 여부를 판별하는 것이 가능한지 알아야합니다.
Aaand 또한 :이 질문을 작성하는 데 걸린 시간의 30 %는 질문과 제목을 올바르게 공식화하는 것이 었습니다. 그래도 100 % 확실한 지 확실하지 않으므로 더 잘 할 수 있다고 생각한다면 편집하십시오.
그냥 자연스럽게 추측 할 수 있지만 실제로 EventArgs에는 뭔가 있어야합니다. 런타임에 검사 (디버깅) 했습니까? –
클릭 이벤트에서이 호출이 코드가 아닌 클릭으로부터 온 것임을 알리는 플래그를 설정합니까? – MEYWD
'발신자'를 사용 하시겠습니까? – DGibbs