2017-10-26 5 views
0

フォームとコンソールを表示し、フォームからコンソールにテキストを書き込むことができますが、できません。フォームからコンソールにtxtを書き込む

まず、コンソールプログラムを作成してSystem.Windows.Formsを追加してフォームを作成しようとしました。それは働いたが、私がフォーム上にマウスを置くと、凍っているようだ。

2番目は、フォームがコンソールスレッドの一部であり、コンソールスレッドが待機中にReadKeyフォームがフリーズしていたためだと思いました。だから、私はbackgroundworkerを私のフォームを開く2番目のスレッドを作るようにしましたが、どちらもうまくいきませんでした。

これは私が逃すことであり、少し助けを求めます。ここ は、これまでの私のコードです:

using System.Windows.Forms; 
using System.Threading; 

namespace testform 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      BackgroundWorker bgworker = new BackgroundWorker(); 
      bgworker.WorkerSupportsCancellation = true; 
      bgworker.WorkerReportsProgress = true; 
      bgworker.DoWork += new DoWorkEventHandler(secondthread.bgworker_DoWork); 
      bgworker.RunWorkerAsync(); 
      Console.Read(); 
     } 

     public static class secondthread 
     { 
      private static Form myform = new Form();//create my form 
      private static TextBox mytxtbox = new TextBox(); 

      public static void bgworker_DoWork(object sender, DoWorkEventArgs e) 
      { 
       BackgroundWorker worker = sender as BackgroundWorker; 
       mytxtbox.TextChanged += new EventHandler(mytxtbox_TextChanged); 
       myform.Controls.Add(mytxtbox); 
       myform.Show(); 
       for (int i = 1; (i <= 10); i++) 
       { 
        if ((worker.CancellationPending == true)) 
        { 
         e.Cancel = true; 
         break; 
        } 
        else 
        { 
         // Perform a time consuming operation and report progress. 
         System.Threading.Thread.Sleep(500); 
         worker.ReportProgress((i * 10)); 
        } 
       } 
      } 

      private static void mytxtbox_TextChanged(object sender, EventArgs e) 
      { 
       Console.WriteLine(mytxtbox.Text); 
      } 
     } 
    } 
} 

私はメインから始まるすべての静的」原因をしなければなりませんでした。

お手伝いできますか?

答えて

2

あなたが最初hereを見て行う必要がありConsole経由Formを表示します。

そして、別のスレッドは必要ありません。

[STAThread] 
private static void Main() { 
    Application.EnableVisualStyles(); 

    //form things 
    TextBox tbx = new TextBox(); 
    Form form = new Form(); 
    tbx.TextChanged += Tbx_TextChanged; 
    form.Controls.Add(tbx); 
    form.Show(); 

    Application.Run(form); 

    Console.ReadLine(); 
} 


private static void Tbx_TextChanged(object sender, EventArgs e) { 
    TextBox tbx = sender as TextBox; 
    Console.Write(tbx.Text); 
} 
+2

最後の無限ループは不要です。理由なくCPUをビジー状態に保ちます。代わりにConsole.ReadLine()を使用できます。 –

-1

これは最適なコードではありません。しかし、あなたが理解しやすくするための方法である: -

static void Main(string[] args) 
{ 
    Form mainForm = new Form(); 
    TextBox txtInput = new TextBox(); 
    txtInput.Height = 50; 
    txtInput.Multiline = true; 
    txtInput.Dock = DockStyle.Fill; 

    Button submitBtn = new Button(); 
    submitBtn.Text = "Send to Console"; 
    submitBtn.Dock = DockStyle.Bottom; 
    submitBtn.Click += (x, e) => 
    { 
     Console.WriteLine(txtInput.Text); 
    }; 

    mainForm.Controls.Add(txtInput); 
    mainForm.Controls.Add(submitBtn); 

    mainForm.ShowDialog(); 
} 
+0

サンプルコードは、メッセージループを開始するには、 'Application.Run'を必要としています。 – Enigmativity

+0

@Enigmativity - しかし、なぜこのシナリオでは必要ですか?読んでください:https://stackoverflow.com/questions/2314514/whats-the-difference-between-application-run-and-form-showdialog –

+0

OPは 'form.Show()'ではなく 'form.ShowDialog () 'が、あなたのアプローチがうまくいくかもしれません。 – Enigmativity

関連する問題