2016-06-14 6 views
0

テキストボックスにインターネットを使用した検証なしでIPアドレスのみを許可しようとしています。私は仕事をする "私的な空のtextBox3_TextChanged"か "timer1_Tick"を持っています。私が入力するか、それが刻々と変化するたびに、それが有効かどうかをチェックします。だからこそ私はそれが高速で、単純なローカルコードを使って、それが有効かどうか、つまり0.0.0.0 - 255.255.255.255をチェックするだけです。テキストボックスは、テキストボックス内のIPアドレスのみを許可します。C#

まず、何もするべきではありませんが、ipが書き込まれると、ipが到達可能かどうかを確認するタイマーが起動します。この目標は、IPが書き込まれたときに、約4秒後にIPに到達できない場合にピクチャボックスが赤くなり、到達可能な場合は緑色になり、「textbox3_TextChanged」まで停止します。

I pingのようなものを試してみましたが、何も入力されたんやIPが到達しなかった場合、それが遅れた場合には、クラッシュした:ここで

private void timer1_Tick(object sender, EventArgs e) 
    { 
     Ping pingSender = new Ping(); 
     PingOptions options = new PingOptions(); 

     options.DontFragment = false; 


     // Create a buffer of 32 bytes of data to be transmitted. 
     string data = "ping"; 
     byte[] buffer = Encoding.ASCII.GetBytes(data); 
     int timeout = 120; 
     PingReply reply = pingSender.Send(textBox3.Text, timeout, buffer, options); 
     if (reply.Status == IPStatus.Success) 
     { 
      pictureBox4.BackColor = Color.LimeGreen; 
     } 
     else 
      pictureBox4.BackColor = Color.Red; 
    } 

はスクリーンショットです:http://imgur.com/Cvix2Tr

あなたがしようとすることができます:)

+0

あなたがチェックし、入力したユーザのために全体のIPを待たなければならないかもしれフォーマットの妥当性と到達可能性のために。これはクラッシュを避けるでしょう。遅れは、通常の方法で、pingメソッドがipに到達できないことがわかる方法です。 –

+0

'textBox'の' KeyDown'イベントを使用して、ENTERが押されているかどうかを確認してから、あなたのチェックをしてください。 –

+0

すべてのコードをtry catchブロック内に入れてください。 –

答えて

0

助けてくださいを交換してくださいこのような何かによって:

(この例では、私のインターフェイスは、1つのTextBoxがtextBoxと1のTextBlockがtextBlockと呼ばれる呼ばれました)

//async to not freeze the UI 
private async void TextBox_OnTextChanged(object sender, TextChangedEventArgs e) 
{ 
    Ping pingSender = new Ping(); 
    var tb = (TextBox)sender; 

    //a little regex to check if the texbox contains a valid ip adress (ipv4 only). 
    //This way you limit the number of useless calls to ping. 
    Regex rgx = new Regex(@"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$"); 
    if (rgx.IsMatch(tb.Text)) 
    { 
     int timeout = 120; 
     try 
     { 
      var reply = await pingSender.SendPingAsync(tb.Text, timeout); 
      textBlock.Text = reply.Status == IPStatus.Success ? "OK" : "KO"; 
     }   
     catch (Exception ex) when (ex is TimeoutException || ex is PingException) 
     { 
      textBlock.Text = "KO"; 
     } 
    } 
    else 
    { 
     if (textBlock != null) 
     { 
      textBlock.Text = "Not valid ip"; 
     } 
    } 
} 
+0

TextBlockを使って、あなたが何を意味するのか分かりません。それはツールボックスにはなく、イベントにはありません。ご指定ください。 – KrisPus

+0

あなたのコードで画像ボックスを使用しているので、画像ボックスでテキストブロックを置き換えることができました。 f.e: 'textBlock.Text =" KO ";' - > 'pictureBox4.BackColor = Color.Red;' –

関連する問題