2012-04-19 16 views
1

テキストボックスに情報を入力してから接続するウィンドウフォームがあります。私は、テキストボックスのいずれかが空である場合にポップアップするエラーメッセージが表示されますが、私はOKを押すとプログラムが続行され、情報が不十分で実行時エラーが発生し、プログラムがクラッシュします。私が欲しいのは、テキストボックスが正しく記入されていないときはいつでも、「接続」を押す前にプログラムがポイントに戻ることです。ボタン内でのエラーの処理

これはコードです:

private void cmdConnect_Click(object sender, EventArgs e) 
    { 

     if (cmdConnect.Text == "Connect") 
     { 
      if (txtGroup.Text == "") 
      { 
       txtGroup.Text = "_Group01"; 
      } 

      if (txtItemID.Text == "") 
      { 
       MessageBox.Show("Please enter ItemID.", "Connect Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 

      } 
       switch (cboServer.Text) 
       { 
        case "": 
         MessageBox.Show("Please select and OPC server", "Connect Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
         break; 


        case "RSLinx Remote OPC Server": 
         if (txtMachine.Text == "") 
         { 
          MessageBox.Show("Please enter a machine name for remote connection", "Connect Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
          break; 
         } 
         else 
         { 
          oOpcServer.Connect(cboServer.Text, txtMachine.Text); 
         } 
         break; 

        case "RSLinx OPC Server": 
         oOpcServer.Connect(cboServer.Text); 
         break; 

        default: 
         if (txtMachine.Text == "") 
         { 
          oOpcServer.Connect(cboServer.Text); 
         } 
         else 
         { 
          oOpcServer.Connect(cboServer.Text, txtMachine.Text); 


         } 
         break; 
      } 
      oOpcGroup = oOpcServer.OPCGroups.Add(txtGroup.Text); 
      oOpcGroup.IsSubscribed = true; 
      oOpcGroup.IsActive = false; 
      oOpcGroup.UpdateRate = 1000; 


      ClHandle = 1; 
      oOpcGroup.OPCItems.DefaultAccessPath = txtAccessPath.Text; 
      oOpcGroup.OPCItems.AddItem(txtItemID.Text, ClHandle); 

      cmdItemWrite.Enabled = true; 
      cmdItemRead.Enabled = true; 
      cmdSyncWrite.Enabled = true; 
      cmdSyncRead.Enabled = true; 
      cmdAsyncWrite.Enabled = true; 
      cmdAsyncRead.Enabled = true; 
      cmdAdvise.Enabled = true; 
      txtSubValue.Enabled = true; 
      cboServer.Enabled = false; 
      txtMachine.Enabled = false; 
      txtGroup.Enabled = false; 
      txtAccessPath.Enabled = false; 
      txtItemID.Enabled = false; 

      cmdConnect.Text = "Disconnect"; 
     } 
     else 
     { 
      oOpcServer.OPCGroups.RemoveAll(); 
      oOpcGroup = null; 
      oOpcServer.Disconnect(); 

      cmdConnect.Text = "Connect"; 
      cmdItemWrite.Enabled = false; 
      cmdItemRead.Enabled = false; 
      cmdSyncWrite.Enabled = false; 
      cmdSyncRead.Enabled = false; 
      cmdAsyncWrite.Enabled = false; 
      cmdAsyncRead.Enabled = false; 
      cmdAdvise.Enabled = false; 
      txtSubValue.Enabled = false; 
      cboServer.Enabled = true; 
      txtMachine.Enabled = true; 
      txtGroup.Enabled = true; 
      txtAccessPath.Enabled = true; 
      txtItemID.Enabled = true; 
     } 
     oOpcGroup.DataChange += new RsiOPCAuto.DIOPCGroupEvent_DataChangeEventHandler(oOpcGroup_DataChange); 
    } 

答えて

2

各メッセージボックスの後returnなステートメントを追加すると、トリックを行うと、最後に作業を行わずに終了するには方法を引き起こします。

+0

が速い答えをありがとう、私もまだそれを受け入れることはできません。これはまさに私が探していたものでした。できるだけ早くそれを受け入れるでしょう:) – Charp

2

Dervallが述べたように、最も簡単な解決策は、それぞれMessageBox.Showコール後にreturn文を追加することです。しかし、より洗練されたソリューションは、接続ロジックを実行する前に、誤った入力データを強調表示するための検証とエラー・プロバイダを使用しています。

とにかく、あなたのコードのリファクタリングに関するいくつかの考えがあります。

private void cmdConnect_Click(object sender, EventArgs e) 
{ 
    if (cmdConnect.Text == "Disconnect") 
    { 
     Disconnect(); 
     SetControlsToDisconnectedState(); 
     return; 
    } 

    if (String.IsNullOrWhiteSpace(txtGroup.Text)) 
     txtGroup.Text = "_Group01"; 


    if (String.IsNullOrWhiteSpace(txtItemID.Text)) 
    { 
     ShowErrorMessage("Connect Error", "Please enter ItemID."); 
     return; 
    } 

    if (String.IsNullOrWhiteSpace(cboServer.Text)) 
    { 
     ShowErrorMessage("Connect Error", "Please select and OPC server"); 
     return; 
    } 

    Connect(cboServer.Text, txtMachine.Text); 
    DoSomethingWithGroup(txtGroup.Text, txtAccessPath.Text, txtItemID.Text); 
    SetControlsToConnectedState(); 
} 

何が変わった:

  • あなたはそれが
  • 方法ShowErrorMessageはそれが
  • がテキストを確認してくださいと言うまさにませ持っていないし、ボタン上のどのテキストを、確認するときには、より読みやすいですIsNullOrWhiteSpaceは空白でいっぱいになる可能性があります。
  • 制御状態が別のコードに移動しました
  • 接続/切断、今ここでUI
  • から

を分離する他の方法:

private void ShowErrorMessage(string title, string message) 
{ 
    MessageBox.Show(message, title, MessageBoxButtons.OK, MessageBoxIcon.Error); 
} 

private void SetControlsToConnectedState() 
{ 
    UpdateControls(true); 
} 

private void SetControlsToDisconnectedState() 
{ 
    UpdateControls(false); 
} 

private void UpdateControls(bool isConnected) 
{ 
    cmdConnect.Text = isConnected ? "Disconnect" : "Connect"; 
    cmdItemWrite.Enabled = isConnected; 
    cmdItemRead.Enabled = isConnected; 
    cmdSyncWrite.Enabled = isConnected; 
    cmdSyncRead.Enabled = isConnected; 
    cmdAsyncWrite.Enabled = isConnected; 
    cmdAsyncRead.Enabled = isConnected; 
    cmdAdvise.Enabled = isConnected; 
    txtSubValue.Enabled = isConnected; 
    cboServer.Enabled = !isConnected; 
    txtMachine.Enabled = !isConnected; 
    txtGroup.Enabled = !isConnected; 
    txtAccessPath.Enabled = !isConnected; 
    txtItemID.Enabled = !isConnected;  
} 

private void Disconnect() 
{ 
    oOpcServer.OPCGroups.RemoveAll(); 
    oOpcGroup = null; 
    oOpcServer.Disconnect();    
} 

private void Connect(string serverName, string machineName) 
{ 
    switch (serverName) 
    { 
     case "RSLinx Remote OPC Server": 
      if (String.IsNullOrWhiteSpace(machineName)) 
      { 
       ShowErrorMessage("Connect Error", "Please enter a machine name for remote connection"); 
       return; 
      } 

      oOpcServer.Connect(serverName, machineName);      
      break; 

     case "RSLinx OPC Server": 
      oOpcServer.Connect(serverName); 
      break; 

     default: 
      if (String.IsNullOrWhiteSpace(machineName))    
       oOpcServer.Connect(serverName);    
      else    
       oOpcServer.Connect(serverName, machineName);    
      break; 
    }   
} 

private void DoSomethingWithGroup(string groupName, string accessPath, string itemID) 
{ 
    oOpcGroup = oOpcServer.OPCGroups.Add(groupName); 
    oOpcGroup.IsSubscribed = true; 
    oOpcGroup.IsActive = false; 
    oOpcGroup.UpdateRate = 1000; 

    ClHandle = 1; 
    oOpcGroup.OPCItems.DefaultAccessPath = accessPath; 
    oOpcGroup.OPCItems.AddItem(itemID, ClHandle); 

    oOpcGroup.DataChange += new RsiOPCAuto.DIOPCGroupEvent_DataChangeEventHandler(oOpcGroup_DataChange); 
} 
+0

これはすばらしく、私のコードよりもプロフェッショナルに見えます。ありがとう、私はあなたに投票を与えることができればいいと思うが、私はまだ15の担当者ではない。 – Charp

+0

@Charp問題なし、多分後で:) –