Во-первых, ваш класс обработки не следует распространять Form1
. Это дает вам иллюзию, что вы можете получить доступ к методам вашей существующей формы, но это не значит, что вы думаете. Когда вы это делаете, вы создаете совершенно новую форму и просто не показываете ее. У этой формы есть собственный набор всех полей экземпляра, поэтому вы не получаете доступ к элементам управления вашей основной формы. Даже если это будет работать (и это не так), это не хорошо спроектированное решение.
Правильный способ сделать это на самом деле намного проще. Вам просто нужно иметь свой другой класс возвращает значение от его методы:
public class PrintClass
{
public string DoWork()
{
Thread.Sleep(2000);//placeholder for real work.
return "Process Completed";
}
}
Теперь ваша основная форма может просто вызвать этот метод и добавить возвращаемое значение в текстовое поле.
Как только вы сделаете это, у вас будет совершенно отдельная проблема. Если вы выполняете работу в потоке пользовательского интерфейса, вы будете блокировать этот поток пользовательского интерфейса во время работы, не позволяя перерисовать форму или какие-либо другие события от обработки. Вам нужно сделать работу в фоновом потоке, а затем вернуться к потоку пользовательского интерфейса, чтобы обновить пользовательский интерфейс с результатами. Есть несколько способов сделать это, но если у вас есть C# 5.0 с помощью await
является самым простым:
public class Form1 : Form
{
private void SomeEventHandler(object sender, EventArgs args)
{
string result = await Task.Run(()=>new PrintClass().DoWork());
TboxPrint.AppendText(result);
}
}
Если вам нужно решение на C# 4.0 вы можете использовать ContinueWith
, который более или менее то, что выше будет переведено, но это не так чисто от синтаксиса.
public class Form1 : Form
{
private void SomeEventHandler(object sender, EventArgs args)
{
Task.Factory.StartNew(()=>new PrintClass().DoWork())
.ContinueWith(t => TboxPrint.AppendText(t.Result)
, CancellationToken.None
, TaskContinuationOptions.None
, TaskScheduler.FromCurrentSynchronizationContext());
}
}
Из кода, который вы предоставили, выглядит так, как append_Tbox fucntion находится в том же классе. Правильно ли я – Vikram
@Vikram, класс 'PrintClass' наследует' form1', поэтому я могу напрямую вызвать этот метод. – Liban
@ Liban - вы не можете получить доступ к TxtBox вне класса, потому что оба элемента управления Private, см. Designer.cs –