2017-11-21 22 views
0

グループボックスに2つのラジオボタンがあり、他のパラメータを設定する別のフォームを呼び出すグループボックスの外にあるボタンを持つ単純なVBネットフォームがあります。ラジオボタンは両方ともシリアルポート経由でデータを送信します。 Form1_loadイベントのブール値はform_loading = Trueです。これはrbtnハンドラでチェックされ、trueであればサブルーチンを終了する必要があります。デバッグ時にチェックが変更されても、デザイン時にチェックされているボタンのイベントが1つ発生し、この時点でform_loadingの値はfalseに設定されています。理由はわかりません。 form_loading = falseステートメントはありません。 rbtnハンドラを削除すると、form_loading = Trueは、他のフォームが呼び出されて返されたときにも保持されます。フォームがロードされ、form_loadingの値がfalseに設定されると、rbtn1-CheckChangedが表示されるので、ボタンを含むグループボックスがアクティブになります。 form_loading = Trueステートメントに達する前に、フォームがロードされ始めると、rbtnイベントが発生していると思われますが、ボタンイベントを発生させないようにするにはどうすればいいですか?あなたの助けみんなのラジオボタンはフォームロード時にVBネットで起動します

Serialport is closed, and the code associated with the button is in the buffer to send to a (closed) com port

Private Sub rbtnDon_CheckedChanged(sender As Object, e As EventArgs) Handles rbtnDon.CheckedChanged 
    If form_loading Then 
     Exit Sub 
    ElseIf rbtnDoff.Checked = True Then 'event fires when other button checkchanged = true, this stops it 
     Exit Sub 
    Else 
     data_out = (SOT + "N" + EOT) 
     SendtoBoard(data_out) 
    End If 
End Sub`enter code here` 
+0

_ "Form1_loadイベントにはブール値があります。" _これはわかりません。おそらく 'Form1_load'を含めるべきでしょう。なぜなら、それがそのイベントハンドラ内のローカル変数なら、あなたはここでそれにアクセスするべきではないはずです。初期値は 'true'で、' false'に設定するコードはありません。それで 'rbtnDon_CheckedChanged'に' false'ということは不可能です。 –

+1

フォームの 'New()'メソッドで 'form_loading'変数を設定するか、フォームがロード/アクティブ化された後に' form_loaded'を宣言して 'true'を設定します。 – Arvo

+1

VB.NET IDEはフォームのコンストラクタを隠していますが、それはあなたを助けません。 "Sub New"と入力し、Enterキーを押します。 UIを変更することを検討してください。一般に、ラジオボタンがチェックされたときには何かを行うのは賢明ではありません。したがって、これを行うには、別のボタンのCheckedChangedイベントハンドラを優先します。 –

答えて

0

ありがとう:スタートをデバッグするときにそのスタンドとして は、IO例外エラーがあります。他の場所で私はこのヒントを見つけました:

プライベートサブrbtnDon_CheckedChanged(オブジェクトとして送信者、EventArgsのようe)のrbtnDonが

をcheckchangedとform1_loadサブにこれを追加処理します:

サブから「rbtnDonはcheckchangedハンドル」削除します

AddHandler rbtnDon.CheckedChanged、New EventHandler(AddressOf rbtnDon_CheckedChanged)

これは問題を完全に解決したようです。

ボックスは、別々のコードの2つのロットを受け入れることはありません何らかの理由として、私は私の元の記事にスタートアップコードを追加することができませんでした - または私は右のそれをやっておりません: それはここにある:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

    For i As Integer = 0 To My.Computer.Ports.SerialPortNames.Count - 1 
     ccbComPort.Items.Add(My.Computer.Ports.SerialPortNames(i)) 
    Next 
    If ccbComPort.Items Is Nothing Then 
     lblMessage.ForeColor = Color.Red 
     lblMessage.Text = "No Serial Ports found" 
    Else 
     ccbComPort.Text = My.Settings.oldPort 
    End If 
    ccbBaudrate.Text = My.Settings.oldBaud 
    pnlComPorts.Visible = True 
    'form_loading = True 

    rbtnDon.Enabled = True 
    AddHandler rbtnDon.CheckedChanged, New EventHandler(AddressOf rbtnDon_CheckedChanged) 
End Sub 

もともと、私はCOMポートの設定用のパネルを持ったフォームを1つ持っていましたが、すべて問題なく、ポート2をform2に移動したときにのみ起動し、その後rbtnDonイベントはform1が起動する前に起動しました。 私はSub New()アプローチを試しましたが、デバッグ時に小さな空白のフォームしか得られません。 Form1_loadを追加すると、「NotImplemented Exception」が発生します。

上記の方法は問題ないと思われますが、追加するのは簡単ですが、それは良い方法ではないでしょうか?