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