目前有一个mainForm.cs,它调用类panel.cs
panel.cs包含多个图片框,其中包含_click,_mousedown,_mouseup
等事件我希望从panel.cs
调用mainForm.cs中的函数我需要使用回调/委托吗?有没有其他方法可以访问此功能
我试过了 Main main = new Main(); main.functioninMain不起作用
任何帮助或指示将不胜感激。
例如
panel.cs
private void pb_button1_Click(object sender, EventArgs e)
{
this.BeginInvoke(new Action(main.functioninMain));
}
答案 0 :(得分:1)
您不应该实例化MainForm的另一个对象,它会创建一个副本,所有带有新MainForm的对象都不会具有您的实际MainForm的值。
方法1 您可以尝试创建MainForm的静态实例,如下所示
public partial class MainForm : Form
{
public static MainForm Instance = null;
public MainForm()
{
InitializeComponent();
Instance = this;
}
public SomeMethod()
{
}
}
现在,如果你有面板类,那么你可以轻松访问MainClass的公共方法和变量
class Panel : Form
{
public Panel()
{
MainForm.Instance.SomeMethod();
}
}
编辑:将句柄作为参数传递给表单(来自Ben Voigt的建议)
方法2:
正如Ben建议的那样,拥有更安全的代码也很重要,因此更清晰的方法是将控件的句柄作为参数传递,然后再访问它们。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
TestClass test = new TestClass();
test.ModifyText(textBox1);
}
}
public class TestClass
{
public void ModifyText(TextBox textBox)
{
textBox.Text = "New text";
}
}
答案 1 :(得分:1)
如果我们可以使用代表和像这样的事件
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Panel formPanel = new Panel();
formPanel.OnPanelClick += new Panel.OnPanelButtonClick(formPanel_OnPanelClick);
formPanel.Show();
}
void formPanel_OnPanelClick(string a)
{
MessageBox.Show(a);
}
}
public partial class Panel : Form
{
public delegate void OnPanelButtonClick(string a);
public event OnPanelButtonClick OnPanelClick = null;
public Panel()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (OnPanelClick != null)
{
OnPanelClick("from Panel.cs");
}
}
}
答案 2 :(得分:0)
你应该不惜一切代价避免循环依赖(A类依赖于B类,B类依赖于A类)。
有很多方法可以做到这一点,但也许一种更简单的方法是使用界面。 mainForm.cs实现如下:
public class mainForm : IMainForm {
// This method is defined in the interface, so mainForm
// must implement it.
public string GetStringFromMainForm() {
return "Hello from MainForm";
}
public void CreatePanel() {
// pass in a reference to myself so panel knows how to
// talk to me.
var panel = new Panel(this);
}
}
IMainForm(界面)看起来像这样:
public interface IMainForm {
string GetStringFromMainForm();
}
然后您的面板类可以与Main表单进行通信,而无需明确引用mainForm.cs:
public class Panel {
// use a private variable to keep track of main form
private IMainForm _mainForm;
// Constructor: pass in a class that implements IMainForm. It isn't
// a type of MainForm, so there's no dependency on the concrete class.
public Panel(IMainForm mainForm) {
_mainForm = mainForm;
}
public void TalkToMainForm() {
var resultFromMainForm = _mainForm.GetStringFromMainForm();
Console.WriteLine(resultFromMainForm);
}
}