0

私のアプリケーションでは、他のすべてのフォームのMdiParentであるメインフォームがあります。ログイン時に、デフォルトでこのフォームが開かれ、このフォームのメニューストリップから次のような他のフォームに移動します。

public partial class MainMenuForm : Form
{
    public MainMenuForm()
    {
        InitializeComponent();
        this.WindowState = FormWindowState.Maximized;
    }

    private void humanResourceToolStripMenuItem_Click(object sender, EventArgs e)
    {
        HumanResourceForm humanresourceform = new HumanResourceForm();
        humanresourceform.MdiParent = this;
        humanresourceform.Show();
    }
}

私の中HumanResourceFormには別のフォームに移動するボタンがありますEmployeeTransferForm

private void button1_Click(object sender, EventArgs e)
{
    Administraror.Humanresource.EmployeeTransferForm emptranfrm = new Administraror.Humanresource.EmployeeTransferForm();
    emptranfrm.ShowDialog();
}

今、私の問題はEmployeeTransferForm、のコントロールからいくつかの値を取得したいという内部にありHumanResourceFormます。EmployeeTransferFormまた、が開いているときまたはアクティブなときに、ユーザーがHumanResourceFormを閉じることを許可しないでください。

HumanResourceFormまた、次のEmployeeTransferFormようなTextBoxのTextプロパティを取得したいと思います。

public partial class EmpLoctnChangeForm : Form 
{
    public EmpLoctnChangeForm( )
    {
        InitializeComponent();
    }

    private void EmpLoctnChangeForm_Load(object sender, EventArgs e)
    {
        intemppk = humanresourceform.txtpk.text;
    }
}

すべての人からの素晴らしいアドバイスを期待しています。
前もって感謝します。

4

3 に答える 3

0

パブリック静的変数を作成して、他の場所からアクセスできます。

public static HumanResourceForm Instance;

次に、コンストラクターで値を設定します。

Instance = this;

次に、EmpLoctnChangeFormで:

intemppk = HumanResourceForm.Instance.txtpk.Test;
于 2012-05-20T19:02:34.590 に答える
0

EmployeeTransferFormクラス(プロパティの値を取得するフォーム)でいくつかのイベントを定義し、それらをHumanresources(プロパティにアクセスするフォーム)に実装することをお勧めします。Formオブジェクト指向アーキテクチャでオブジェクト全体を渡すことはお勧めしません。

したがって、コードフォームは次のEmployeeTransferFormようになります。

public class EmployeeTransferForm: Form
{
    public delegate Text GetTextHandler();

    GetTextHandler getSampleTextFromTextBox = null;
    public event GetTextHandler GetSampleTextFromTextBox
    {
        add { getSampleTextFromTextBox += value; }
        remove { getSampleTextFromTextBox -= value; }
    }

    //the rest of the code in the class
    //...
}

そして、Humanresourcesこのように:

class Humanresources : Form
{
    private void button1_Click(object sender, EventArgs e)
    {
        Administraror.Humanresource.EmployeeTransferForm emptranfrm = new Administraror.Humanresource.EmployeeTransferForm();
        emptranfrm.GetSampleTextFromTextBox += new EmployeeTransferForm.GetTextHandler(GetSampleTextFromTextBox_EventHandler);
        emptranfrm.ShowDialog();
    }


    Text GetSampleTextFromTextBox_EventHandler()
    {
        return myTextBox.Text;
    }

    //the rest of the code in the class
    //...
}
于 2012-05-20T19:08:00.660 に答える
0

おそらく、これらの「クロスビュー」通信とフォーム作成を担当する、ある種の「ViewController」の実装を検討してください。このアプローチは、フォーム(ビュー)を作成し、それらの間でデータを共有するプロセスをより適切にカプセル化します。ビューの結合が少なくなります。たとえば、ビューの情報の表示方法を変更したい場合は、外部から表示され、正しく名前が付けられているコントロールに依存する別のフォームを変更せずに、1つのフォームを変更できます。まったく存在します。

このビューコントローラーは、コンストラクター引数としてビューに渡すことができます。または、必要に応じて、システム全体のシングルトンとして実装することもできます(この場合、アプリケーションコンテキストに複数のビューコントローラーが存在する可能性は低いため)。

インターフェイスの例は次のようになります。

interface IViewController<T>
    where T : Form
{ 
    void ShowForm();
    void ShowFormModal();
}

また、さまざまなシナリオに特化したViewControllerの作成を開始できます。

public IEmployeeViewController : IViewController<EmployeeForm>
{
    void ShowForm(string intemppk);
}

これは、アーキテクチャに関する非常に基本的な提案であり、1つの投稿で説明できるよりも複雑ですが、正しい方向に進む可能性があります。

于 2012-05-21T05:24:47.750 に答える