【问题标题】:Pass an integer from one form to another to do some work将整数从一种形式传递到另一种形式来做一些工作
【发布时间】:2019-03-30 16:36:53
【问题描述】:

我的问题是关于在 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();
    }
}

【问题讨论】:

标签: c# visual-studio


【解决方案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();  
             }
    }

【讨论】:

  • 您还需要考虑到用户可能会关闭movieform 实例,如果发生这种情况,您的代码将因对象处理异常而失败。您需要订阅 FormClosing 事件并处理您的局部变量
  • IsDisposed 属性也可以解决这个问题。
  • @NavidRsh 感谢您的帮助。这真的解决了我的问题。
【解决方案2】:

您必须有其他表格的引用。不要将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();
}

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

类字段与对象(此处为表单)具有相同的生命周期。

【讨论】:

    【解决方案3】:

    不要在每个表单上创建一个接收值的方法或将值作为参数传递给每个表单的构造函数,或者创建一个新属性来设置值以便稍后搜索它,您应该使用已经为此创建的控件。这是你的使用方法

    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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-23
      • 2021-08-06
      • 2015-06-06
      • 1970-01-01
      • 2012-03-11
      相关资源
      最近更新 更多