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

本文关键字:Windows 控件 交互 类的 另一个 | 更新日期: 2023-09-27 18:19:05

我是一个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中发现)。请问我该如何解决这个问题?谢谢。

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

继承不会在相关类的实例(对象)之间创建链接。

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

可以通过构造函数注入实现#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回答中的第二个选项)

如果你需要更多的信息,请留下评论