1

我是 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 中找到)上没有任何内容。请问我该如何解决这个问题?谢谢。

4

4 回答 4

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:一种在 form 上form1,一种在 form 上staff

我对这个问题提出了两种不同的解决方案:

  1. 而不是打开Form1open Staff

  2. 传递form1or 的引用form1.ErrorTextBoxto 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);
于 2013-01-05T15:53:21.273 回答
0

这里的主要问题是当您在员工类中继承 form1 类时。无法通过工作人员访问 form1 的表单成员(标签)。

这就是你面临这个问题的原因。

如果您有任何疑问,请联系。

于 2011-12-31T10:37:15.983 回答
0

此链接将向您展示解决该问题的 3 种方法。我建议您专注于凯文对解决方案的回答。

1-在form1上创建一个句柄,使标签修饰符公开并在form2上访问它(不建议,在链接问题中解释)

2-将变量参数传递给form2(凯文回答中的第一个选项)

3-创建一个将更新值的事件(凯文回答中的第二个选项)

如果您需要更多信息,请发表评论。

于 2011-12-31T12:23:21.057 回答
0

您不能从其他类访问任何表单控件。访问它们的简单方法是不安全的方法,在这里..假设您有一个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);
 // ...
}

但请记住,这样做是不安全的操作。此代码将在调试模式下抛出错误。所以在没有调试的情况下运行它..

于 2013-01-05T15:26:20.013 回答