2013-01-23 2 views
1

Я использую C# VS2008, приложение WinForm У меня есть элемент checklistbox в моей форме (приложение для win-form) В коде я проверяю некоторые элементы в checklistbox с помощью SetItemChecked (индекс, ложь), и он вызывает событие ItemCheck. Я также разрешаю пользователю проверять элементы в этом проверочном списке, а также поднимать событие ItemCheck, когда пользователь проверяет или снимает флажок. Как я могу найти в событии ItemCheck, как происходит это событие (через код или через пользовательскую клавиатуру/ввод мыши)? Спасибо.C# checklistbox отличается между ItemCheck по коду и щелчку мыши

ответ

2

Я думаю, что нет простой способ, чтобы разделить ситуацию с использованием кода.
Единственное, что приходит на ум, является использование глобальной формы переменной:

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; 
    } 
} 
+0

Булева переменная никогда не чувствует себя хорошо, но, как правило, правильное решение. –

+0

Я чувствую то же самое, но я не могу найти лучшего способа сделать это. Возможно, последовательность операций может быть инкапсулирована в одну функцию. – Steve