Это мой первый класс:Я пытаюсь создать метод в одном классе и пытаюсь вызвать из другого класса (форма) по нажатию кнопки
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
/*_enemy = new Class1(this);
int y = Class1.MyMethod(0);
textBox1.Text = Convert.ToString (y);*/
}
private Class1 _enemy;
private void button1_Click(object sender, EventArgs e)
{
_enemy = new Class1(this);
int y = Class1.MyMethod();
textBox1.Text = Convert.ToString(y);
}
}
}
и это мой второй класс:
namespace WindowsFormsApplication2
{
public class Class1
{
public Class1(Form1 form)
{
_form1 = form;
}
public static int MyMethod()
{
int i = 0;
for (int j = 1; j <= 20; j++)
{
i = j;
//Thread.Sleep(100);
}
return i;
}
}
// DON'T initialize this with new Form1();
private Form1 _form1;
}
Программа работает правильно, и я получаю только 20 в качестве вывода в TextBox
. То, что я хочу, это выход каждый раз, когда цикл работает.
Нравится 1,2,3,.........20
и остановиться.
как счетчик, может быть. Я также пробовал использовать Timer
, но не мог этого сделать.
EDIT:
@Mong Чжу У меня есть крест проверил код, все еще получаю исключение.
Для справки здесь являются полные коды:
Form1.cpp
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
Class1 MyCounterClass;
private void Form1_Load(object sender, EventArgs e)
{
MyCounterClass = new Class1();
// register the event. The method on the right hand side
// will be called when the event is fired
MyCounterClass.CountEvent += MyCounterClass_CountEvent;
}
private void MyCounterClass_CountEvent(int c)
{
if (textBox1.InvokeRequired)
{
textBox1.BeginInvoke(new Action(() => textBox1.Text = c.ToString()));
}
else
{
textBox1.Text = c.ToString();
}
}
public Form1()
{
InitializeComponent();
}
private Class1 _enemy;
private void button1_Click(object sender, EventArgs e)
{
MyCounterClass.MyCountMethod(300, 0, 10);
}
}
}
и class1.cpp
namespace WindowsFormsApplication2
{
public class Class1
{
public delegate void Counter(int c); // this delegate allows you to transmit an integer
public event Counter CountEvent;
public Class1()
{
}
public void MyCountMethod(int interval_msec, int start, int end)
{
System.Threading.Thread t = new System.Threading.Thread(() =>
{
for (int i = start; i <= end; i++)
{
// Check whether some other class has registered to the event
if (CountEvent != null)
{
// fire the event to transmit the counting data
CountEvent(i);
System.Threading.Thread.Sleep(interval_msec);
}
}
});
// start the thread
t.Start();
}
// DON'T initialize this with new Form1();
private Form1 _form1;
}
}
Вы ищете [IProgress] (https://blogs.msdn.microsoft.com/dotnet/2012/06/06/async-in-4-5- дающая возможность-прогресс-и-аннулирование-в-асинхронного-APIs /)? – Default
Я не знаю, что это? Можете ли вы уточнить? –
В основном это контракт, в котором говорится, что производитель (ваша форма) хочет знать, что делает потребитель (класс1). Это также описано [здесь] (http://simplygenius.net/Article/AncillaryAsyncProgress) и [здесь] (http://blog.stephencleary.com/2012/02/reporting-progress-from-async-tasks.html) , Это не совсем то, что говорит ваш вопрос, но чтение вашего вопроса, похоже, указывает на это. – Default