2

パネルを含む UserControl があり、パネルには画像ボックスが含まれています。ピクチャ ボックスにマウスを移動したときに、メインフォームのラベルを更新したいと考えています。メイン フォームに 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?
        }
    }
4

5 に答える 5

2

Actually it's possible to do in your case like:

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

But the right way is with events like Felice Pollano mentinoed:

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");
    }
}
于 2012-04-18T09:30:35.647 に答える
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();
于 2012-04-18T09:35:09.513 に答える
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";
    }
}
于 2012-04-18T09:32:11.433 に答える
1

いくつかのオプションがあります:

  1. ユーザー コントロールでイベントを作成し、フォームをリッスンする必要があります (これは、ほとんどの C# プログラマーが推奨する方法だと思います)。
  2. メイン フォームへの参照を (コンストラクターで) ユーザー コントロールに渡します。このようにして、ユーザー コントロールはその MainForm を認識します。
  3. this.ParentFormMainForm クラスにキャストすると、参照が得られます。

オプション 2 と 3 は多少快適で怠惰ですが、ユーザー コントロールが特定のクラス MainForm について認識しなければならないという代償があります。最初のオプションには、MainForm クラスを認識しないため、別のプロジェクトでユーザー コントロールを再利用できるという利点があります。

于 2012-04-18T09:34:52.257 に答える
0

ユーザー コントロールからイベントを発行し、メイン フォームからサブスクライブする必要があります。少なくとも、これは winform で提案されているパターンです。いずれにせよ、関心のあるエージェントを更新するためのドライバーとしてコントロールを使用するのではなく、座標を確認する必要があるエージェントからコントロールを「監視可能」にするという考えです。

于 2012-04-18T09:27:03.090 に答える