与来自另一个类C#的Windows控件交互

时间:2011-12-31 08:51:12

标签: c# winforms controls interaction

我是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 个答案:

答案 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上。

我建议针对这个问题采用两种不同的解决方案:

  1. 而不是打开Form1打开Staff

  2. form1form1.ErrorTextBox的引用传递给staff

  3. 你可以通过构造函数注入来做#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);
 // ...
}

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