2017-08-06 15 views
1

メソッドを使って文字列を別のメソッドのフラグに応じてonPaint()メソッドで表示しようとしました。 表示されているとおりに正しく表示できませんでした。C#でDrawString()メソッドやMessageBox()を使わずにFormやPictureBoxに文字列を表示する方法

このようなメッセージを表示または描画するために、DrawString()またはMessageBox()を使用しない他の方法がありますか。

私はThread.Sleep()を使用しました。 onPaint()インサイド

if(auvSend == true) { 

       base.OnPaint(e); 



       g.DrawString("Received Aggrigated Data from AUV # " + auv[auvSenderID].auvID, font,auvSendMsg, 500, 36); // Display that the sink receive data from the AUV 

       MessageBox.Show("Received Aggrigated Data from AUV # " + auv[auvSenderID].auvID); 

       player.Play(); 

       Thread.Sleep(3000);    

       g.DrawImage(new Bitmap("C:/temp/temp.png"), 500, 36, 196, 16);// clear 

       player.Stop(); 

       auv[auvSenderID].queue1.Clear(); 

       auvSend = false; 



      } 

それがバックグラウンドでフラグの値を変更するには、特定の番号が含まれている場合、私は配列リストを確認し、作業方法を実行します。十分なコンテキストがありません

if (moveBtnIsClicked == false && movebtnGeneticIsClicked == false) 
        { 

         if (auv[0].queue1.Count == 10) 
         { 


          foreach (Packet packet in auv[0].queue1) 
          { 
           auv[0].SendToSink(packet); 
          } 


          auvSenderID = 0; 

          auvSend = true; 

          topology.Invalidate();       


         } 



         if (auv[1].queue1.Count == 10) 
         { 


          foreach (Packet packet in auv[1].queue1) 
          { 
           auv[1].SendToSink(packet); 
          } 

          auvSenderID = 1; 


          auvSend = true; 

          topology.Invalidate(); 


         } 


         if (auv[2].queue1.Count == 10) 
         { 


          foreach (Packet packet in auv[2].queue1) 
          { 
           auv[2].SendToSink(packet); 
          } 


          auvSenderID = 2; 

          auvSend = true; 

          topology.Invalidate(); 


         } 


         if (auv[3].queue1.Count == 10) 
         { 


          foreach (Packet packet in auv[3].queue1) 
          { 
           auv[3].SendToSink(packet); 
          } 


          auvSenderID = 3; 

          auvSend = true; 

          topology.Invalidate(); 




         } 


        } 
+0

_ DrawingString()を使用して__without__を使用する方法はありますか?あなたの最初の試みで失敗したので?タイマーを使わないのはなぜですか? – TaW

+0

私はThread.Sleep(3000)を使用しました! – Rose

+0

私は知っています。しかし、私はあなたの描画コードがどのように見えたのか分かりません。あなたが待っていたスレッドもありません。 UIスレッド?プログラムをフリーズするのは悪い考えです。 – TaW

答えて

1

をあなたの特定のニーズに合わせた答えを提供することがあなたの質問にあります。しかし、あなたが使っている基本的なアプローチは根本的に間違っていると私は信じています。私。 OnPaint()メソッドにコードを挿入する理由がないように見えるので、UIスレッドがブロックされ、その問題の再描画の途中で(二重に間違っています)。

あなたはこのような何かに働くだろう(例えば、label1は、と呼ばれる)(例えば、button1と呼ばれる)アクションを開始ボタンを押すと、あなたがテキストを表示するフォーム上のラベルを持っていると仮定すると:

コンテキストを欠く
private async void button1_Click(object sender, EventArgs e) 
{ 
    label1.Text = "Received Aggregated Data from AUV # " + auv[auvSenderID].auvID 
    label1.Visible = true; 
    player.Play(); 
    await Task.Delay(3000);    
    label1.Visible = false; 
    player.Stop(); 
    auv[auvSenderID].queue1.Clear(); 
    auvSend = false; 
} 

、私は、またPlay()かどうか、および/またはStop()方法完全迅速かplayerが何であるかを知りません。しかし、それらが即座に返されるメソッドであると仮定すると、上記のテキストを設定し、ラベルを表示し、Play()メソッドを呼び出すと、UIスレッドをブロックせずにを3秒待ってからラベルを隠すか、Stop()メソッドなどを呼び出します。一旦待ちが終わったら。

ユーザーがボタンをクリックした以外の操作に対応している場合は、同じ基本的なことができますが、別の方法(つまり、Clickイベントハンドラではありません)で行うことができます。テキスト表示などを開始するときにそのメソッドを呼び出してください。

+0

私が必要とするラベルの変更は、ボタンをクリックしないif文に依存します! – Rose

+0

_ "必要なラベルの変更は、if文に依存します。ボタンをクリックしないでください。" - 私は既に私の答えに書いているのと同じです:_ "あなたがボタンをクリックした以外の何かに応答してこれを行うなら、あなたは同じ基本的なことをすることができます "_。あなたは良い[mcve]を提供することを気にしなかったので、あなたがそれをどうやって行うのか正確にあなたに言うことはできません。しかし、一般的な考え方は、 'if'ステートメントがあるところでは、上に示した' Click'イベントハンドラと同じように動作するメソッドを呼び出します。詳細の最も明白な違いは、別の方法では、あなたは 'sender'と' e'パラメータを控えることができるということです。 –

+0

質問を更新しました... – Rose

関連する問題