将一种形式的整数传递给另一种形式以完成某些工作

时间:2019-03-30 16:36:54

标签: c# visual-studio

我的问题是有关在C#Windows表单应用程序中处理多个表单的问题。我正在开发用于播放电影并使用按钮逐帧移动它的代码。我已经有了在Windows Media Player中使用ctlcontrols逐帧移动影片的代码。

我遇到的问题是我想要一个主表单和一个电影表单,当我单击主表单中的按钮时,我想向其他表单发送一个数字,如果数字是2,我希望电影以电影形式逐帧显示。而且我想每次单击按钮时都无需打开新表单即可做到这一点。我已经在第二种形式中创建了一个函数,然后在主表单中的按钮中对其进行了调用。预计它会起作用,但不会。

该按钮的主要形式代码为:

private void button1_Click(object sender, EventArgs e)
{
        value = txtSendNum.Text; // get the value from the textox and
                                 // assign it to string variable
        MovieForm movieform = new MovieForm(); //create an object for MovieForm
        movieform.ConnectForms(value);            
}

第二种形式的函数(ConnectForms函数)的代码为:

public void ConnectForms(string value)
{
    val = Convert.ToInt32(value);
    if (val == 2)
    {
        axWindowsMediaPlayer1.Ctlcontrols.play();
        axWindowsMediaPlayer1.Ctlcontrols.currentPosition += 0.5;
        axWindowsMediaPlayer1.Ctlcontrols.stop();
    }
}

3 个答案:

答案 0 :(得分:1)

您每次用户单击按钮时都在创建一个新的MovieForm,这是错误的。您需要对以前打开的MovieForm的引用。 这是对象和类的含义之间的区别。您需要引用该对象,而不是来自同一类的新对象。 使它工作的简单方法类似于以下代码:

    MovieForm movieform = null; 
    private void button1_Click(object sender, EventArgs e)
    {
            value = txtSendNum.Text; 
            if(movieform == null || movieform.IsDisposed)
            {
                   movieform = new MovieForm(); //create an object for MovieForm
                   movieform.Show(); 
                   movieform.ConnectForms(value);            
            }
            else 
            {
                   movieform.ConnectForms(value); 
                   movieform.Focus();  
             }
    }

答案 1 :(得分:0)

您必须具有另一种形式的参考。与其将movieform声明为局部变量,不如将其声明为类级变量(即字段)

private MovieForm _movieform = new MovieForm();

private void button1_Click(object sender, EventArgs e)
{
    value = txtSendNum.Text; //get the value from the textox and assign it to string variable
    _movieform.ConnectForms(value);
    _movieform.Show();
}

局部变量,即方法中声明的变量的生命周期仅限于一个方法调用(我不是在谈论诸如迭代器和闭包之类的特殊情况)。

类字段与对象(在此为Form)具有相同的生存期。

答案 2 :(得分:0)

与其在每个窗体上创建一个接收值的方法,也不是在每个窗体的构造函数上将该值作为参数传递,或者创建一个新的属性来设置该值以供以后搜索它,而不是使用为此已创建的控件。这是您的用法

https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.tag?view=netframework-4.7.2

private void buttonNewCustomer_Click(object sender, EventArgs e)
{
   /* Create a new customer form and assign a new 
    * Customer object to the Tag property. */
   CustomerForm customerForm = new CustomerForm();
   customerForm.Tag = new Customer();
   customerForm.Show();
}