【问题标题】:How to pass dynamic variables to another form?如何将动态变量传递给另一种形式?
【发布时间】:2023-03-13 14:52:01
【问题描述】:

我有两个 Form1 和 Form2,它们都已经相互“连接”了。我已经在它们之间传递按钮信号、轨迹栏值、计时器滴答声……。

Form1 中的连接如下所示:

private void Form1_Load(object sender, EventArgs e)
    {
        Form2 = new Form2(timer1,btnBoost,btnBrake);
        Form2.Show();
    }

在 Form2 内部:

public Form2(Timer timer,Button Boost,Button Brake)
    {
        InitializeComponent();
        _timer = timer;
        _boost = Boost;
        _brake = Brake;          
    }

现在我想从 Form1 中传递一个变量,该变量在每个 timertick 到 Form2 都会改变它的值,以创建一个图表。

在 Form1 内部是这样的

public partial class Form1 : Form {

public double ValueThatIWant;

}

我已经给它一个价值了

private void Timer1_Tick1(object sender, EventArgs e){

ValueThatIWant = Math.Sqrt(somevalue.X,somevalue.Y);
}

我已经尝试通过从 Form2 调用 Form1 来访问该变量

Form1.valueThatIWant

但是自从

public double valueThatIWant

被声明为public,它的值总是0。

private void FillChart()
    {

       this.chart1.Series["Velocity"].Points.AddXY(time,Form1.ValueThatIWant);

    }

//That's the method I've created in Form2 to create a chart.

我想从内部调用变量(?)

public Form1()

方法,让我得到变化的值,而不仅仅是0。

希望这能描述我的问题。

提前致谢!

【问题讨论】:

  • "被声明为 public,它的值总是 0。"嗯?访问修饰符对字段的值绝对没有影响。当然,您必须在某处为该字段分配一个值。但是,我没有看到您正在执行此操作的任何代码。
  • 我们在这里需要一个minimal reproducible example。我们猜不出你做了什么,你需要给我们看看。
  • 所以我已将 Form1 中的变量声明为 public double ValueThatIWant。完成后,我在每个计时器滴答声中传递这个变量一个值。在 Form1 中我可以很好地使用它,但从 Form2 来看,变量似乎总是 0。
  • 您是如何“连接”您的两个类并将信号和值相互传递的?您需要正确的 Form1 实例。我想在你的Form2 中你已经创建了一个Form1 的新实例,它与你设置值的实例无关。但是,如果不了解这种“联系”的样子,就很难进一步帮助您。
  • 进行了一些修改,希望对您有所帮助

标签: c# forms public


【解决方案1】:

您需要访问更改值的实例。在您的代码中,Form2 除了btnBoostbtnBreak 之外,不知道关于该实例的任何事情。您需要向Form2 的构造函数提供对Form1-instance 的引用:

public Form2(Timer timer, Form1 f1, Button Boost, Button Brake)
{
    InitializeComponent();
    _form1 = f1;
    _timer = timer;
    _boost = Boost;
    _brake = Brake;          
}

在你的Form1-code 中你现在需要这个:

private void Form1_Load(object sender, EventArgs e)
{
    Form2 = new Form2(timer1,this,btnBoost,btnBrake);
    Form2.Show();
}

代替:

private void Form1_Load(object sender, EventArgs e)
{
    Form2 = new Form2(timer1,btnBoost,btnBrake);
    Form2.Show();
}

现在您可以在Form2 中访问_form1.ValueIWant

此外,您还可以从构造函数中省略这两个按钮,因为它们可能是Form1 的组件。在这种情况下,您需要在 Form1 public 属性中创建适当的字段,但是:

class Form1
{
    public Button BreakButton => btnBreak;
}

您现在可以通过哪种方式使用_form1.BreakButton

【讨论】:

  • 哦,好的,我明白了。我已经按照你说的做了,在 Form2 中创建了一个私有的 Form1 f1,还提供了一个参考 _form1 = f1。但我不确定如何在 Form1 中进行?如果您能提供帮助会很高兴...
  • @HannesHauser 我不明白您所说的“继续前进”是什么意思。你想达到什么目标?
  • 在我的方法 Form1_Load 中,我编写了 Form2 = new Form2(timer1,btnBoost,btnBrake)。 Visual Studio 要求我提供与 Form1 f1 匹配的参数...希望您明白我的意思!
  • 天哪,它有效!你是一个救生员。 _form1.Button 也可以!非常感谢。
  • 嘿,我有一个后续问题!我想将form1的类传递给form2。我已经用 this.ClassWhatever 试过了,但它不起作用。如果您能再次帮助我,将不胜感激!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-16
  • 2021-12-22
  • 1970-01-01
  • 2012-08-17
  • 2017-06-17
  • 1970-01-01
相关资源
最近更新 更多