我有一个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?
}
}
答案 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)
您有几种选择:
this.ParentForm
投射到MainForm类,然后您有参考。选项2和3稍微更舒适和懒惰,但成本是用户控件必须知道特定类MainForm。第一个选项的优点是可以在另一个项目中重用用户控件,因为它不知道MainForm类。
答案 4 :(得分:0)
您应该从用户控件发布event并从主窗体订阅它。 至少这是winform建议的模式。在任何情况下,想法是从需要查看坐标的代理进行控制“可观察”,而不是将其用作更新感兴趣的代理的驱动程序。