我是一个c#新手,遇到了以下问题:
我有一个名为Form1
的类,它在设计视图中包含许多控件。
我有另一个名为Staff
的类,它继承自Form1
,其中包含一个名为PlayAll
的方法,该方法一个接一个地播放用户在音乐键盘上播放的所有音符。
在方法PlayAll
中,我实现了一个条件,该条件确定用户是否按下了任何注释。
如果用户没有按任何注释,则ErrorTextBox
(包含在Form1.cs中)应显示错误消息。
这是PlayAll()
的相关代码(在Staff.cs中)
public void PlayAll()
{
ErrorTextBox.Text = "";
if (Pressed_Notes.Count == 0) //check if the user pressed a key
{
ErrorTextBox.Text = "There are no music notes to play!";
}
else
{
//Play the music notes
}
}
我的问题是没有出现在ErrorTextBox
(在form .cs中发现)。请问我该如何解决这个问题?谢谢。
继承不会在相关类的实例(对象)之间创建链接。
public class Form1 : Form
{
public TextBox ErrorTextBox;
}
public class Staff : Form1
{
public void PlayAll() { }
}
创建两个实例
Form1 form1 = new Forms1();
form1.Show();
Staff staff = new Staff();
staff.Show();
打开两个表单。现在存在两个不同的errortextbox:一个在表单form1
上,一个在表单staff
上。
对于这个问题,我有两种不同的解决方案:
不打开
Form1
,打开Staff
传递
form1
或form1.ErrorTextBox
的引用给staff
。
可以通过构造函数注入实现#2。将Staff
的构造函数更改为:
private TextBox _form1ErrorTextBox;
public Staff (Form1 form1)
{
InitializeComponent();
_form1ErrorTextBox = form1.ErrorTextBox;
}
public void PlayAll()
{
_form1ErrorTextBox.Text = "";
if (Pressed_Notes.Count == 0) {
_form1ErrorTextBox.Text = "There are no music notes to play!";
} else {
//Play the music notes
}
}
现在您可以像这样将Form1
的实例传递给Staff
:
Form1 form1 = new Forms1();
form1.Show();
Staff staff = new Staff(form1);
不能从其他类访问任何表单控件。访问它们的简单方法是不安全的方法,就是这样…假设你有一个类form1
,它有一个控件Textbox1你有另一个类myClass
。只需传递所需的控件作为参数与ref
。例如
public Class myClass
{
TextBox tb;
public myClass(ref TextBox mtb)
{
tb = mtb;
}
//...Now you can use tb as your textbox and the value in it will be
//...displayed on form1 control
}
public Class form1
{
myClass mc = new myClass(ref textBox1);
// ...
}
但是记住,这样做是不安全的操作。此代码将在调试模式下抛出错误。
这里的主要问题是当您在staff类中继承form1类时。不能通过staff访问form1的表单成员(标签)。
这就是你面临这个问题的原因。
如有疑问请联系。
这个链接将向您展示通过该问题的3种方法。我建议你把注意力集中在凯文的答案上。
1-在form1上创建句柄,使标签修饰符公开,并在form2上访问它(不建议,在链接的问题中解释)
2-将变量参数传递给form2 (Kevin回答中的第一个选项)
3-创建一个事件来更新值(Kevin回答中的第二个选项)
如果你需要更多的信息,请留下评论