2013-03-04 3 views
3

Есть ли какой-либо метод или возможно написать метод для выполнения набора инструкций, когда флажок (Windows Form) снят (если не отмечен)? Я уточню это, предоставив свой пример кода.Метод CheckBox (event) для "checked = false"

Существующие примеры кода:

private void ChkBox_CheckedChanged(object sender, EventArgs e) 
{ 
    if (ChkBox.Checked == false) 
     { 
       MessageBox.Show("unchecked"); 
     } 
} 

Q: Могло if condition избежать, написав метод для этого, который запускается на выполнение только тогда, когда флажок снят.

Иллюстрация: Что-то вроде этого:

private void ChkBox_Unchecked(object sender, EventArgs e) 
{ 
    MessageBox.Show("unchecked"); 
} 

дополнительные комментарии: У меня нет ничего, чтобы выполнить для события «флажок» .. Так что думаю, если я могу избежать checkchanged событие, заменив его unchecked типа события.

+1

winforms, wpf, asp.net? –

+5

Нет такой вещи, потому что это бесполезно. –

+0

@lazyberezovsky, оконные формы – Enthusiastic

ответ

5

Если вам действительно нужно, что странные события, а затем создать пользовательский флажок, унаследовав от CheckBox. Перекрыть это OnCheckedChanged события, и добавить Unchecked события:

public class StrageCheckBox : CheckBox 
{ 
    public event EventHandler Unchecked; 

    protected override void OnCheckedChanged(EventArgs e) 
    { 
     base.OnCheckedChanged(e); 

     if (!Checked) 
      OnUnchecked(e); 
    } 

    protected virtual void OnUnchecked(EventArgs e) 
    { 
     if (Unchecked != null) 
      Unchecked(this, e); 
    } 
} 

Используйте StrangeCheckBoxes вместо флажков по умолчанию. Подпишитесь на событие Unchecked. Вуала, у тебя такое странное поведение.

Замечание На самом деле я бы не предложил использовать пользовательский контроль или if/else во всех сценариях. Если у вас много флажков с таким поведением, тогда пользовательский контроль лучше, чем много дублированных if/else в каждом обработчике. Если у вас есть несколько элементов управления или одиночный обработчик для всех флажков, тогда я бы пошел с использованием if/else.

+0

Не было нисходящим (фактически защищенным выше), но «завистливым»? Кажется ... самонадеянным и субъективным. –

+0

@GrantThomas вот как я называю downvoters, которые не оставляют комментарии и ответы downvote. Только причина таких действий, которые я вижу, - зависть. Не так ли? :) –

+2

Согласен! если не сейчас .. можно использовать для дальнейшего использования .. удобный код .. спасибо за обмен .. –

1

Нет, единственным обнаруженным событием является обнаружение, когда произошло изменение состояния, тогда вы должны проверить состояние, чтобы определить, как оно изменилось.

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

+0

Спасибо .. да, если еще лучше, чем этот сложный подход! – Enthusiastic

0

Насколько я знаю, событие будет запущено во всех изменениях, вы можете написать свой собственный элемент управления, который отличает выбранное значение и вызывает отдельные события, но не уверен, что это действительно стоит.

1

Нет, извините. Это единственное событие, которое вы можете вызвать для изменения состояния. Ваш код выглядит отлично. По какой-то причине вам это не нравится?

0

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

private void ChkBox_CheckedChanged(object sender, EventArgs e) 
{ 
    if (ChkBox.Checked) return; 

    MessageBox.Show("unchecked"); 
} 
+4

Лично я никогда не понимал, почему люди используют «== true» в сравнении. –

+1

Теперь это лучше :). Я только что скопировал-вставил код и заменил «false» на «true». – niculare

2

вы можете наследовать CheckBox и override OnCheckedChanged

class ExtendedCheckBox : CheckBox 
{ 
    public event EventHandler Unchecked; 
    protected override void OnCheckedChanged(EventArgs e) 
    { 
     base.OnCheckedChanged(e); 

     if (Checked == false) 
      OnUnchecked(e);    
    } 
} 
+0

Это кажется худшим способом сделать это; как я предположил, вы могли бы разоблачить два _new_ события, чтобы отличить состояние и запустить их на 'CheckedChanged' соответственно, без существенного проглатывания предупреждений о ложном состоянии. –

+0

@GrantThomas - можете ли вы быть более конкретным? –

+0

+1 Для чего-то, что покрывает исходный вопрос, но это похоже на излишний сценарий. Если производительность bool-сравнения настолько плотная, чтобы иметь значение, OP, вероятно, придется сравнивать скорость с вызовами виртуальных методов! – JRoughan

0

Это будет простое прямое решение, хотя наилучшим предлагаемым способом будет наследование с CheckBox и изменение событий. Но относительно простой способ заключается в следующем:

Уменьшите ширину CheckBox так, чтобы CheckBox Label больше не виден. Должен быть виден только ящик. Затем добавьте еще одну метку рядом с коробкой, которая должна быть взаимно исключающей из коробки.

Теперь отредактируйте событие CheckBox Clicked. Для определения состояния флажка используйте какой-то флаг. Вуаля!