0

私は、ソケットで動作するインスタント メッセンジャー アプリケーションを C# で作成しています。すべてのソケットの問題を管理し、IRC のように動作するようになりました。ただし、プライベートメッセージシステムを実装したいです。2 つのフォームがあります。1 つはメイン、2 番目はプライベート メッセージのようなプロトタイプです。ウィンドウは次のようになります。そして、ここに私の問題があります:

string priv_windows, who, msg;

...

public void createform(string who, string msg)
{
Form2 frm = new Form2();
frm.Text = who;
frm.label1.Text = msg;
priv_windows += who += " ";
frm.Show();
}

...

createform("1st instance", "some text");
createform("2nd instance", "other text");

これは、フォームの新しいインスタンスを作成するのに問題なく機能しますが、これらの子フォームを作成した後、これらの子フォームと通信する方法が見つかりません。つまり、たとえば最初のフォームインスタンスのテキストを変更するにはどうすればよいですか? 特定のフォームインスタンスにインデックスなどを設定する簡単な方法はありますか? 後で簡単に使い方を説明してください。

4

6 に答える 6

1
public class Form2 : System.Windows.Forms.Form
{
    public System.Windows.Forms.Label label1 = new System.Windows.Forms.Label();

    public void Main(string args[])
    {
        Form2 first = createform("1st instance", "some text");
        Form2 second = createform("2nd instance", "other text");
    }

    public Form2 createform(string who, string msg)
    {
        Form2 frm = new Form2();
        frm.Text = who;
        frm.label1.Text = msg;
        priv_windows += who += " ";
        frm.Show();
        return frm;
    }

    public void SetMessage(string message)
    {
        this.label1.Text = message;
    }
}
于 2012-10-05T10:38:10.493 に答える
0

私がパラメータwhoofvoid CreateForm(String, String)rightを解釈すると、特定の人とのアクティブな会話ごとに1つのプライベートウィンドウが必要になります。

これが正しければ、会話ウィンドウへの参照を保持する代わりに、クラスDictionary(詳細についてはMSDNを参照)を使用します。List

もう1つの良い点は、使用されているすべてのフォームを管理するための静的メンバーを実際に持つフォームコントローラークラスを実装することです。これにより、コード内のどこからでもウィンドウフォームにアクセスできるようになります。コードのすべての部分がアクセスできるようにしたくない場合は、名前空間を使用してアクセシビリティを制御できます。

于 2012-10-05T11:12:53.233 に答える
0

ドメイン内のオブジェクトと通信するには、イベント アグリゲーターを使用することをお勧めします。

于 2012-10-05T11:43:04.283 に答える
0

彼らとの「コミュニケーション」に使用できる参照を保持する必要があります。文字列などのプライベート変数のように、たとえば次のようになります。

string priv_windows, who, msg;
List<Form> forms = new List<Form>();

public void createform(string who, string msg)
{    
    Form2 frm = new Form2();
    frm.Text = who;
    frm.label1.Text = msg;
    priv_windows += who += " ";
    forms.Add(frm);
    frm.Show();
}

public void ChangeChild()
{
    Form f = forms[0];
    f.Text = "New Form Title Text";
}

これは、コレクション内の最初の Form を操作する単純な例にすぎません。多数ある場合は、どの取得を変更するかを決定するためのより洗練された方法が必要になります。

于 2012-10-05T10:43:28.713 に答える
0

リストを作成し、その中にフォームを保持することができます。

private List<Form2> forms = new List<Form2>();

public void createform(string who, string msg)
{    
    Form2 frm = new Form2();
    forms.Add(frm);
    // etc

リスト内の各フォームにアクセスできるようになりました。

foreach (Form2 form in forms)
{
    form.Text = "Hello world";
}
于 2012-10-05T10:34:40.627 に答える
0

任意のコレクションを使用して、フォーム インスタンスを保存および参照します

于 2012-10-05T10:34:58.697 に答える