3

私はまだC#を学んでいるので、これがばかげた質問である場合は許してください。また、「長い」方法以外でこれを言う方法がわからないため、長い投稿を許してください。

私のシナリオ:

私は自分のアプリケーションにDockPanel SuiteParentFormを使用しており、NotesFormandがありBrowserFormます (実際にはもっと多くのBrowserFormタイプがありますが、1 つに機能させることができれば、他のタイプにも機能させることができるはずです)

そのParentFormため、アプリケーションの開始時にロードされ、ロード時に がロードされ、からのボタン クリック イベントを介して がロードされ、NotesFormそのインスタンスが開いたままになり、閉じません。BrowserFormParentForm

したがって、情報を に入力するまでに、NotesForm3 つのフォームすべてのインスタンスが既に確立されています。(そこが問題だと思います)

私の目標は、文字列変数に入力された情報を取得しtextBox1て、イベント経由であると思われるものをクリックすることなく、それをNotesForm呼び出すことです。notesTextBrowserFormNotesFormTextChanged

現在、プロパティ (get、set) を使用してフォームに情報を取得できますが、それを実現するには、NotesFormとのボタンをクリックする必要があります。BrowserForm

現在のやり方を示すために、一種の馬鹿げたコードを含めています。私の完全なコードは非常に大きいので、混乱を避けて、私が行っていることの概念を示すだけです.

親フォーム

public partial class parentForm : Form
{
    private notesForm notesForm = new notesForm();
    public parentForm()
    {
        InitializeComponent();

    }
    private void parentForm_Load(object sender, EventArgs e)
    {
        notesForm.Show(mainDock, DockState.DockLeft);

    }
    private void tb1_Click(object sender, EventArgs e)
    {
        BrowserForm.notesText= notesForm.passInfo;
    }

ノートフォーム

public partial class notesForm : DockContent
{
    private string _passInfo;
    public notesForm()
    {
        InitializeComponent();

    }
    public string passInfo
    {
        get { return textBox1.Text; }
        set
        {
            _passInfo = value;
            textBox1.Text = _passInfo;
        }
    }

}

ブラウザフォーム

public partial class BrowserForm : DockContent
{
    private string passInfo;
    public BrowserForm()
    {
        InitializeComponent();

    }
            public string passInfo
    {
        get
        {
            return _passInfo;
        }
        set
        {
            _passInfo = value;
            notesText = _passInfo;
        }

    }
    string notesText;
    private void button1_Click(object sender, EventArgs e)
    {
    MessageBox.Show(notesText);
    }
    }

}

したがって、これは現在機能していますが、機能させるには、親フォームのボタンをクリックしてからブラウザフォームのボタンをクリックする必要があります。理想的には、ノート フォームのテキスト ボックスに情報を入力し終わった後で、その情報をブラウザ フォームに渡すために必要です。テキストボックスに入力される情報は静的で、常に 9 文字の長さで、数字 (電話番号) で構成されます。

また、私のアプリケーションが行うことの背景についても説明します。仕事でイントラネットのさまざまなツールにアクセスするために使用しています。40 から 80 の異なるブラウザー ウィンドウを開いているのとは対照的に、それらを 1 つのアプリケーションに統合し、最終的には (うまくいけば) それらのツールから自動的にいくつかの情報をスクレイピングするため、ページを検索する必要はありません。ツールは自動的に引っ張るだけです。これは悪意のあるものではありませんし、私はスパマーでも何でもありません。それぞれのサービスに 8 ~ 10 個のツールを持っている 10 社の異なる企業の ISP 技術サポートを行っています。

これについての支援をいただければ幸いです。または、私がやっていることをより簡単に進める方法があれば、喜んでお知らせします. また、私のコード全体を見たい場合は (それが役立つ場合)、お知らせください。投稿してもかまいません。非常に面倒です。

4

2 に答える 2

2

あなたの質問が正しいかどうかわかりません。ある子フォームから別の子フォームに情報を渡したいと思います。

これを行う 1 つの方法は次のようになります。

1. 次のようなインターフェイスを作成します。

public interface IDataContainer
{
     void SetData(String data);
}

2.parentFormインターフェイスを実装します。

public partial class parentForm : Form, IDataContainer

そして、メソッドをフォーム クラスに実装します。このシンプルなインターフェースにより、実装者は目的を問わず (文字列) データを格納できます。

あなたの場合、メソッドの実装はSetDataブリッジとして機能し、 を に接続し、フォームでデータを渡しnotesFormます。BrowserForm

public partial class parentForm : Form, IDataContainer
[...]

public void SetData(String dataComingFromOtherSource)
{
     this.browserFormInstance.passInfo = dataComingFromOtherSource;
}
[...]

3.各子フォームIDataContainerのコンストラクターに型指定されIDataContainerたパラメーターを追加して、実装で参照を渡すことができるようにします(それがあなたの になりますparentForm)。この上:

public partial class parentForm : Form
{
    private notesForm notesForm = null;

    public parentForm()
    {
        InitializeComponent();

        // Note that at this point you are instantiating
        // the child-form and you are passing a reference
        // to the `parentForm` so that you can pass information
        // to it, and from it to whatever other form you may
        // need, in an elegant way.
        this.notesForm = new notesForm(this);
    }

4. 最後に、 にnotesFormデータを設定するロジックを配置しますcontainer

public partial class notesForm : DockContent
{
    // On runtime this will in fact the `parentForm` object instance.
    IDataContainer myDataContainerInstance = null;

    public notesForm(IDataContainer myDataContainerInstance) : base()
    {
        InitializeComponent();

        // Assign the reference so that you can use it later
        this.myDataContainerInstance = myDataContainerInstance;

        textBox1.TextChanged += new EventHandler(textBox1_TextChanged);
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        this.myDataContainerInstance.SetData(textBox1.Text);
    }
}

注:静的クラス/シングルトンを持つことも解決策になり、ちなみにはるかに簡単です...

于 2013-08-29T05:20:16.700 に答える
1

TextChangedはい、次のように、NotesForm でイベントをフックする必要があります。

public partial class notesForm : DockContent
{
    public notesForm()
    {
        InitializeComponent();
        textBox1.TextChanged += new EventHandler(textBox1_TextChanged);
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        // Get value of text box here and either pass it to the Browser form 
        // via its constructor or get an instance of the Browser form and use 
        // the set of a property in the Browser form to store the value 
        string theTextBoxValue = textBox1.Text;
    }
}
于 2013-08-29T04:37:22.327 に答える