0

目前有一个 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));
  }
4

3 回答 3

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");
        }
    }
}
于 2012-04-20T05:44:59.893 回答
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 的建议)

方法二:

正如 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";
    }
}
于 2012-04-20T04:59:43.447 回答
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();
}

然后您的面板类可以与主窗体对话,而无需显式引用 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);
  }
}
于 2012-04-20T05:05:46.747 回答