我是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
上没有任何内容(在Form1.cs中找到)。我该如何解决这个问题?感谢。
答案 0 :(得分:1)
继承不会在所涉及的类的实例(对象)之间创建链接。
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);
答案 1 :(得分:0)
这里的主要问题是当你在staff类中继承form1类时。无法通过工作人员访问form1的表单成员(标签)。
这就是你遇到这个问题的原因。
如果您有任何疑问,请联系。
答案 2 :(得分:0)
This link将向您展示3种传递该问题的方法。我建议你专注于Kevin的解决方案。
1-在form1上创建句柄,使标签修饰符公开并在form2上访问它(不建议,在链接问题中解释)
2-将变量参数传递给form2(Kevin的答案中的第一个选项)
3-创建一个将更新值的事件(Kevin的答案中的第二个选项)
如果您需要更多信息,请发表评论。
答案 3 :(得分:0)
您无法从其他类访问任何表单控件。访问它们的简单方法是不安全的方式,这里是..
假设你有一个具有控件Textbox1的类form1
你有另一个班myClass
。只需将所需控件作为参数传递给ref
。
e.g。
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);
// ...
}
但请记住,这样做是不安全的。此代码将在调试模式下抛出错误。所以在没有调试的情况下运行它。