我正在尝试从单独的类中重新填充文本框。我浏览了相同问题的多个实例,发现我认为这是一个很好的解决方案。但是,我无法使其工作。我试图通过创建一个单独的线程来将数据发送回来解决该问题。我不知道这是一个好主意。但是,我知道没有它,数据就会回到正确的位置,因为它会显示在控制台中。有什么建议么?谢谢!
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void updater(double value)
{
textBox1.Text = value.ToString(); // Trying to update here
Console.WriteLine(value); // The new multiple makes if back to here...
}
private void button1_Click(object sender, EventArgs e)
{
CALC c = new CALC();
c.valuecalculator(.0025);
}
}
public class CALC
{
public void valuecalculator(double multiplier)
{
for (int index = 0; index < 1000; index++)
{
Form1 f = new Form1();
double newMultiple = index * multiplier;
f.updater(newMultiple);
}
}
}
答案 0 :(得分:2)
您正在使用valuecalculator方法创建表单的新副本,但是应该使用相同的表单。
有很多方法可以解决这个问题。
您可以将表单的实例传递到valuecalculator方法中。
您可以在Program.cs
或最初初始化它的任何启动文件中对静态表单进行引用。
您可以为表单提供对自身的引用
您可以通过使valuecalculator返回结果而不是返回void来在button1 click事件中放置代码以更新表单(这很有意义)
答案 1 :(得分:0)
您的组件只能做一件事。计算器应执行计算并返回结果:
public static class Calc
{
public static double CalculateValue(double multiplier)
{
return 100 * multiplier;
}
}
表格应尽可能简单。意味着他们只关心显示表单元素并将事件传递给事件处理程序。这些事件处理程序中发生的实际逻辑应由其他人负责。我喜欢在构造函数中传递此逻辑:
public partial class Form1 : Form
{
public Form1(Func<double, double>CalculateValue)
{
InitializeComponent();
button1.Click += (sender, eventArgs) => textBox1.Text = CalculateValue(.0025).ToString();
}
}
构造和相互连接类是另一个责任。最简单的版本是使用Main()方法:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var form = new Form1(Calc.CalculateValue);
Application.Run(form);
}
}