Я использую C# VS2008, приложение WinForm У меня есть элемент checklistbox в моей форме (приложение для win-form) В коде я проверяю некоторые элементы в checklistbox с помощью SetItemChecked (индекс, ложь), и он вызывает событие ItemCheck. Я также разрешаю пользователю проверять элементы в этом проверочном списке, а также поднимать событие ItemCheck, когда пользователь проверяет или снимает флажок. Как я могу найти в событии ItemCheck, как происходит это событие (через код или через пользовательскую клавиатуру/ввод мыши)? Спасибо.C# checklistbox отличается между ItemCheck по коду и щелчку мыши
ответ
Я думаю, что нет простой способ, чтобы разделить ситуацию с использованием кода.
Единственное, что приходит на ум, является использование глобальной формы переменной:
public class Form1:Form
{
bool _isCodeClick = false;
.....
// Somewhere in your code
_isCodeClick = true;
checkedListBox1.SetItemChecked(index, true);
_isCodeClick = false;
.....
private void CheckedListBox1_ItemCheck(Object sender, ItemCheckEventArgs e)
{
if(_isCodeClick == true)
{
// Do processing for click by code
}
else
{
// Do processing for click by user
}
}
}
Если вы идете для этого решения помните принять дополнительные меры для правильного исключения ловушки, которые могут обойти сбросу глобальной переменной к ложному состоянию.
Возможно, используя передовые манипуляции с событиями клавиатуры и мыши, вы можете найти разумный способ определить, что вызвало событие ItemCheck, но иногда некоторые решения слишком сложны и не стоят того.
EDIT: Пересмотр моего ответа. Я чувствую необходимость внести небольшое изменение, чтобы уменьшить проблемы с обслуживанием, которые подразумевает этот подход.
Код, который установлен в логическую переменную и вызвать SetItemChecked должен быть воплощен в виде отдельной функции, как этот
private void SetItemCheckedFromCode(int index, bool toSet)
{
try
{
_isCodeClick = true;
checkedListBox1.SetItemChecked(index, true);
}
finally
{
_isCodeClick = false;
}
}
Булева переменная никогда не чувствует себя хорошо, но, как правило, правильное решение. –
Я чувствую то же самое, но я не могу найти лучшего способа сделать это. Возможно, последовательность операций может быть инкапсулирована в одну функцию. – Steve