C#如何从我的用户控件访问主窗体上的setter方法?

时间:2012-04-18 09:24:18

标签: c# forms methods setter

我有一个UserControl,它包含一个面板,该面板包含一个图片框。 当我鼠标移动到图片框上时,我想更新MainForm上的标签。 我在主窗体上有一个get / set方法,但我该如何使用它?感谢

  public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
        public String MouseCords
        {
            get { return this.MouseCordsDisplayLabel.Text; }
            set { this.MouseCordsDisplayLabel.Text = value; }
        }
    }


    public partial class ScoreUserControl : UserControl
    {
        public ScoreUserControl()
        {
            InitializeComponent();
        }

        private void ScorePictureBox_MouseMove(object sender, MouseEventArgs e)
        {
            // MainForm.MouseCords("Hello"); //What goes here?
        }
    }

5 个答案:

答案 0 :(得分:2)

实际上,在你的情况下可以这样做:

((MainForm)this.ParentForm).MouseCords = "Some Value Here";

但正确的方式是像Felice Pollano这样的事件:

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();

        this.myCustomControlInstanse.PicureBoxMouseMove += new EventHandler<StringEventArgs>(myCustomControlInstanse_PicureBoxMouseMove);
    }

    private void myCustomControlInstanse_PicureBoxMouseMove(object sender, StringEventArgs e)
    {
        this.MouseCordsDisplayLabel = e.Value // here is your value
    }
}


public class StringEventArgs : EventArgs
{
    public string Value { get; set; }
}

public partial class ScoreUserControl : UserControl
{
    public event EventHandler<StringEventArgs> PicureBoxMouseMove;

    public void OnPicureBoxMouseMove(String value)
    {
        if (this.PicureBoxMouseMove != null)
            this.PicureBoxMouseMove(this, new StringEventArgs { Value = value });
    }

    public ScoreUserControl()
    {
        InitializeComponent();
    }

    private void ScorePictureBox_MouseMove(object sender, MouseEventArgs e)
    {
        this.OnPicureBoxMouseMove("Some Text Here");
    }
}

答案 1 :(得分:2)

理想情况下,您应该为此举起一个事件。

创建代理

public delegate void  Update();

在用户控件中

public class MyUserControl : UserControl
{
public event Update OnUpdate;

}

在主窗体上注册用户控件事件的处理程序。

public class Main
{
public Main()
{
myUserControl.OnUpdate += new Update(this.UpdateHandler);
}

void UpdateHandler()
{
//you can set the delegate with sm arguments
//set a property here

}
}

关于用户控制,

要点击按钮

来举起活动

这样做

OnUpdate();

答案 2 :(得分:1)

这可能会给你一个想法......

    public partial class ScoreUserControl : UserControl
{
    public ScoreUserControl()
    {
        InitializeComponent();
    }

    private void ScorePictureBox_MouseMove(object sender, MouseEventArgs e)
    {
        // MainForm.MouseCords("Hello"); //What goes here?
        MainForm parent = this.ParentForm as MainForm;
        if (parent != null) parent.MouseCordsDisplayLabel.Text = "Hello";
    }
}

答案 3 :(得分:1)

您有几种选择:

  1. 在用户控件上创建一个事件,并且必须形成一个监听它(我认为这是大多数C#程序员推荐的方式)。
  2. 将对主窗体的引用传递给User Control(在构造函数中)。这样,用户控件就知道它的MainForm。
  3. this.ParentForm投射到MainForm类,然后您有参考。
  4. 选项2和3稍微更舒适和懒惰,但成本是用户控件必须知道特定类MainForm。第一个选项的优点是可以在另一个项目中重用用户控件,因为它不知道MainForm类。

答案 4 :(得分:0)

您应该从用户控件发布event并从主窗体订阅它。 至少这是winform建议的模式。在任何情况下,想法是从需要查看坐标的代理进行控制“可观察”,而不是将其用作更新感兴趣的代理的驱动程序。