2013-07-28 3 views
2

Я новичок в C#. У меня есть два текстовых поля в форме и кнопке. Когда я нажимаю кнопку, я хочу, чтобы значение 1 было помещено в текстовое поле1, а затем квадрат вычислялся и помещался в текстовое поле2. Затем я хочу, чтобы код выполнял цикл для каждого номера между 1-20 и помещал соответствующие значения в текстовые поля. Я просто пишу этот код, чтобы привыкнуть к функциям вызовов. Мой код ниже, но он ничего не делает: -Простой вызов функции в C# GUI

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Threading; 

namespace WindowsFormsApplication3 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      for (int initialVal = 1; initialVal >= 20; initialVal++) 
      { 
       textBox1.Text = initialVal.ToString(); 
       int sum = calculation(initialVal); 
       textBox2.Text = sum.ToString(); 
       System.Threading.Thread.Sleep(500); 
      } 
     } 

     static int calculation(int x) 
     { 
      int sum; 
      while (x <= 20) 
      { 
       sum = x * x; 
       x++; 
       return sum; 
      } 
      return 0; 
     } 
    } 
} 

Любые предложения о том, что с ним не так?

ответ

5

Две вещи:

1)

for (int initialVal = 1; initialVal >= 20; initialVal++) 

Это никогда ничего не будет делать, потому что условие выхода удовлетворяется - вы, вероятно, имел в виду initialVal <= 20

2) Вы должны использовать фоновый поток - в противном случае ваш графический интерфейс не будет обновляться до тех пор, пока ваша кнопка1 _ Обработчик кликов не будет полностью завершен. Например. посмотрите на BackgroundWorker class.

+0

Большой глаз. Легко упускать из виду. –

+0

Спасибо @DennisTraub. Кажется, теперь проблема не возникает, но только после завершения значения «20». Это, без сомнения, то, что вы предложили, и фоновые потоки звучат слишком далеко для меня на этом этапе, но я рад, что теперь знаю ответ. Спасибо – thefragileomen

+2

Затем выполните ваши эксперименты в простом консольном приложении и создайте Console.Writeline(), чтобы напечатать число и квадраты. –

1

не Ваш для цикла не будет выполнено, так как его условие не выполнено:

initialVal >= 20 

Измените его

initialVal <= 20 

выполнить петлю, в 20 раз.

0

Измените петлю, как это было предложено другими.

И, по этой линии, я думаю, вы можете просто сделать

int sum = initialVal * initialVal ; 

Вам не нужно Calculate квадратуры номер, и эта функция ничего значимого не делать в любом случае.

0

Вызов Sleep в графическом интерфейсе может сделать ваше приложение неприемлемым, поэтому лучше использовать фоновый поток или таймер. Таймер проще. Во-первых, в режиме просмотра просто перетащите таймер (он находится в разделе «Компоненты» вашего инструментария) в форму. Установите для свойства Interval значение 500. Затем дважды щелкните его и поместите там свой код обновления. Обратите внимание: вам не нужен цикл; Вам просто нужно код, чтобы сказать ему, чтобы увеличить initialVal с каждым тиком и остановка в 20:

private void timer1_Tick(object sender, EventArgs e) { 
     textBox1.Text = initialVal.ToString(); 
     int sum = calculation(initialVal); 
     textBox2.Text = sum.ToString(); 
     if (initialVal++ == 20) 
      timer1.Enabled = false; 
    } 

Теперь измените код button_click просто удар таймера:

private void button1_Click(object sender, EventArgs e) { 
     initialVal = 1; 
     timer1.Enabled = true; 
    } 

Наконец сделать initialVal как переменная члена, так как обе функции нуждаются в доступе к ней:

public partial class Form1 : Form { 
    int initialVal; 
Смежные вопросы