2015-08-11 5 views
0

Я знаю, что это похоже на легкое исправление, но у меня проблемы. У меня есть CheckBox, когда проверено, я удаляю источник данных DataGridView на моем Windows Form и удаляю ReadOnly свойства нескольких Textbox.Управление «CheckBox_Checked» Событие без бесконечного цикла

Я знаю, что событие CheckedChanged отправит мой код в бесконечный цикл, но я не могу понять, какое событие будет обрабатывать это изменение без изменения CheckedState каждый раз. Я пробовал использовать Click, MouseClick и CheckStateChanged событий без везения.

Это мой текущий код:

Private Sub chkManual_MouseClick(sender As Object, e As EventArgs) Handles chkManual.MouseClick 

     If Not Me.chkManual.Checked Then 
     Me.chkManual.Checked = False 
     Me.cbRegion.SelectedIndex = -1 

     Me.txtIssueDate.ReadOnly = True 
     Me.txtCasenum.ReadOnly = True 
     Me.txtCommnum.ReadOnly = True 

     Exit Sub 

    Else 
     Me.dgDataEntry.DataSource = Nothing 
     Me.cbRegion.SelectedIndex = -1 

     Me.txtIssueDate.ReadOnly = False 
     Me.txtCasenum.ReadOnly = False 
     Me.txtCommnum.ReadOnly = False 
     ClearForm() 

     frmPDF.Hide() 
     Exit Sub 
    End If 
    End Sub 

Свойства CheckBox: AutoCheck = True, Checked = False и CheckState = Unchecked

Я смотрел в эти уже:

CheckBox_Checked event

Is there a simpler way to process check boxes?

CheckBox reverts to checked after being unchecked

How to check if a checkboxes state has changed

How can I prevent an assignment statement to CheckBox.Checked from raising the CheckChanged event?

http://www.vbforums.com/showthread.php?758455-CheckBox-code-got-stuck-in-an-infinite-loop-can-not-unchecked-it

EDIT

Это помогает, если ваш ClearForm() не изменяет CheckedState вашего CheckBox назад до False каждый раз. Спасибо @Visual Vincent за то, что он указал на очевидное. Нет ничего плохого с кодом, изменил EventHandler к CheckedChanged

Окончательного код (так просто):

Private Sub chkManual_CheckedChanged(sender As Object, e As EventArgs) Handles chkManual.CheckedChanged 
    If Me.chkManual.Checked Then 
     Me.dgDataEntry.DataSource = Nothing 
     Me.cbRegion.SelectedIndex = -1 

     Me.txtIssueDate.ReadOnly = False 
     Me.txtCasenum.ReadOnly = False 
     Me.txtCommnum.ReadOnly = False 

     ClearForm() 
     frmPDF.Hide() 
    Else 
     Me.cbRegion.SelectedIndex = -1 

     Me.txtIssueDate.ReadOnly = True 
     Me.txtCasenum.ReadOnly = True 
     Me.txtCommnum.ReadOnly = True 
    End If 
End Sub 
+0

Удаление строки 'Me.chkManual.Checked = False' и установка код в Checke Событие dChanged должно работать, если вы используете System.Windows.Forms CheckBox. --- Кроме того, вам не нужна строка 'Exit Sub', если у вас нет кода ниже инструкции If. :) –

+0

Кстати, метод 'ClearForm()' случайно изменил состояние вашего флажка? –

+0

WOW! Это именно то, что было ... '' ClearForm() 'Sub изменил состояние' CheckBox'. Я чувствую себя таким глупым, я знал, что мне не хватает чего-то такого простого. Спасибо ~ – alybaba726

ответ

0

Я не уверен, если вы хотите CheckBox, когда проверено, автоматически или не Отмените снова!? ... кажется странным интерфейсом.

В любом случае, если вы хотите что-то происходит, когда Проверить изменения состояния:

Private Sub chkManual_CheckedChanged(sender As Object, e As EventArgs) Handles chkManual.CheckedChanged 
    If chkManual.Checked Then 
     Debug.Print("Checked") 
     Me.dgDataEntry.DataSource = Nothing 
     Me.cbRegion.SelectedIndex = -1 

     Me.txtIssueDate.ReadOnly = False 
     Me.txtCasenum.ReadOnly = False 
     Me.txtCommnum.ReadOnly = False 
     ClearForm() 

     frmPDF.Hide() 
    Else 
     Debug.Print("UnChecked") 
     Me.cbRegion.SelectedIndex = -1 

     Me.txtIssueDate.ReadOnly = True 
     Me.txtCasenum.ReadOnly = True 
     Me.txtCommnum.ReadOnly = True 
    End If 
End Sub 

Вы можете снять флажок без бесконечного цикла, как это:

Private Sub chkManual_CheckedChanged(sender As Object, e As EventArgs) Handles chkManual.CheckedChanged 
    Static counter As Integer 
    If chkManual.Checked Then 
     counter = counter + 1 ' just to show we're not in an infinite loop... 
     Debug.Print("Checked " & counter) ' just to show we're not in an infinite loop... 
     chkManual.Checked = False 
    Else 
     Debug.Print("UnChecked") 
    End If 
End Sub 

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

+0

Первый блок кода, as-is, никогда не запускает 'Check' =' True', поэтому ни одно из элементов «Textbox» не изменяет свойства ReadOnly. – alybaba726

+0

? ... уверен, что так оно и есть; Я протестировал его. Если он не работает, у вас есть другие проблемы/события в игре, о чем свидетельствует ваш более поздний комментарий 'ClearForm()', влияющий на ваше поведение ... –

+0

да, вы правы. Я отвечу на ваш ответ. – alybaba726

0

Вы можете удалить код, который изменяет состояние флажка? Пример:

Me.chkManual.Checked = False 

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

+0

Выполнение этого автоматически отменяет флажок, даже без запуска события «MouseClick». – alybaba726

0

Я думаю, что самый простой способ - удалить прослушиватель событий перед обработкой флажка. Используйте блок try-finally, чтобы убедиться, что прослушиватель событий флажка всегда установлен назад.

Try 
RemoveHandler chkManual AddressOf chkManual_MouseClick 
Me.chkManual.Checked = False 
... 
Finally 
AddHandler chkManual AddressOf chkManual_MouseClick 
End Try 
+0

Я заинтригован этим методом, но когда я добавляю эти строки и пытаюсь снять флажок «CheckBox», но условие «Наконец» добавляет обработчик снова, независимо от 'CheckedState'. Есть идеи? – alybaba726

+0

Вы должны добавить обработчик всегда назад, чтобы убедиться, что флажок работает как обычно. – Mino

+0

Я добавил его до 'End Sub', но это не имело значения. – alybaba726

Смежные вопросы