1

WinFormsアプリでDockPanelスイートを使用しています。DockContentクラスはSystem.Windows.Forms.Formクラスから派生し、私の2つのフォームdockRoundsとdockToolboxはDockContentクラスから継承します。

これは私がこれを行うのは初めてであり、これはおそらくばかげた質問ですが、実行時に、dockRoundsおよびdockToolboxフォームのコントロールにアクセスするにはどうすればよいですか?

アプリを最初に実行するときに2つのフォームを読み込む方法は次のとおりです。

public partial class frmMainNew : Form

    clsMWDockPanel mapPanel;
    dockToolbox dockT = new dockToolbox();
    dockRounds dockR = new dockRounds();

    public frmMainNew()
    {
        InitializeComponent();

        dockPanel = new DockPanel();

        SuspendLayout();

        dockPanel.Parent = panelMain;
        dockPanel.Dock = DockStyle.Fill;
        dockPanel.DefaultFloatWindowSize = new Size(108, 528);

        dockPanel.BringToFront();
        dockPanel.BackColor = Color.Transparent;
        dockPanel.DocumentStyle = DocumentStyle.DockingSdi;

        ResumeLayout();

        string error = "Errors:\r\n";
        try
        {
            loadRounds();
            loadToolbox();
        }
        catch (Exception)
        {
            error = error + "The Toolbox and/or Rounds menu could not be created\r\n";
        }

    }

    public void loadToolbox()
    {
        dockT.CloseButton = false;
        dockT.ShowHint = DockState.Float;
        dockT.Text = "Toolbox";
        dockT.BackColor = Color.WhiteSmoke;
        dockT.Icon = this.Icon;
        dockT.Show(dockPanel);
    }

    public void loadRounds()
    {
        if (mapPanel == null)
        {
            CreateMapPanel().Show(dockPanel, DockState.Document);
        }

        mapMain.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
        //mapMain.BringToFront();

        dockR.CloseButton = false;
        dockR.ShowHint = DockState.DockRightAutoHide;
        dockR.Text = "Rounds Menu";
        dockR.BackColor = Color.WhiteSmoke;
        dockR.Icon = this.Icon;
        dockR.Show(dockPanel);
    }

    DockContent CreateMapPanel()
    {
        mapPanel = new clsMWDockPanel();
        mapPanel.ShowHint = DockState.Document;
        mapPanel.Controls.Add(mapMain);

        return mapPanel;
    }

よろしくお願いします

レディー

4

4 に答える 4

4

異なるフォーム上のオブジェクト間の通信/リンクを実現するために使用できる戦略がいくつかあります。注 : ここでの私の回答は、DockPanelSuite に特に関連する問題に対処するものではなく、「セカンダリ」フォームが「独立」している (つまり、MainForm によって「所有」されていない) か、 MainForm の子 Form を作成しました。これは、あなたが求めていることは、実装の可能性のあるバリエーションとは無関係であるという信念に基づいて行われた意識的な選択です.

  1. 最も簡単な戦略 (多くのコントロールにとって面倒な場合) は、メイン フォームから操作するコントロールを公開するセカンダリ フォームでパブリック プロパティを宣言することです。たとえば、Form2 にボタンがあり、そのクリック イベントをメイン フォームで処理するとします。

Form2 で、次のようなプロパティを定義します。

public Button form2Button
{
    get { return button1; }
}

メイン フォームの Load イベントで、ここで Form2 のインスタンスが作成されると仮定すると、 Form2 の Button の Click イベントをサブスクライブできます。

Form2 myForm2;
Form3 myForm3;

private void Form1_Load(object sender, EventArgs e)
{
   myForm2 = new Form2();
   myForm2.form2Button.Click += new EventHandler(form2Button_Click);

   myForm3 = new Form3();
}

また、Form3 には、Form2 で Button を公開したのと同じ方法で、Public Property で公開した TextBox があることが容易に想像できます。

したがって、 Form2 の Button クリックに対して、次のように MainForm のイベント ハンドラーを実装できます。

public void form2Button_Click(object sender, EventArgs e)
{
    // do something here with the TextBox on Form3 
    // myForm3.theTextBox.Text = 
}

... その他の戦略 ...

  1. たとえば、セカンダリ フォームでは、ボタンを押すと、メイン フォーム (または Form2 が公開されているその他のエンティティ) がサブスクライブできるパブリック イベントを発生させ、適切なものを適切なターゲットにディスパッチできます。

  2. 一般に、パブリッシャーがメッセージを送信する単一の (おそらく静的な) クラスに、より高いレベルでメッセージの受け渡しを抽象化することができ、メッセージは登録済みのリスナーにディスパッチされます。

最後に、ここでの議論はあなたにとって興味深いかもしれません:

あるフォームのコントロールを別のフォームに使用する

一番、

于 2009-11-17T17:54:08.070 に答える
1

クラス、dockRounds、dockToolboxは、アクセスしたいプロパティ/イベントを公開する必要があります。したがって、コントロールのイベントに接続する場合は、それを公開イベントにルーティングします。

于 2009-11-17T17:57:21.183 に答える
0

Controlsプロパティにアクセスしてみましたか?

var controls = dockRounds.Controls;
于 2009-11-17T16:33:32.617 に答える