0

タブページにフォームを動的に割り当てています。フォームの更新されたバージョン (コントロールに異なるテキスト値が割り当てられている) をタブ ページに割り当てようとする場合を除いて、正常に動作します。実際、フォームの複数のインスタンスを作成してタブ ページに割り当ててもクラッシュしないことに少し驚いています (新しいインスタンスが古いインスタンスの上に積み重ねられている場合、新しいインスタンスは上に表示され、新しい値が表示されます)。

では...新しいバージョンを追加する前に、タブ ページに追加した以前のフォームを削除するにはどうすればよいですか? または、既存のフォームにアクセスしてその値を変更できますか。

コードを表示しただけで、より明確になると思います。

メインフォーム:

    private enum TabControls {
        BasicInfo,
        ConfidentialInfo,
        RolesAndSecurity,
        InactiveInfo
    }

    string currentNode = string.Empty;

    public Form1() {
        InitializeComponent();
        CenterToScreen();
    }

    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) {
        currentNode = e.Node.Name;
        UpdateActiveTabForNode();
    }

    // This is called both by treeView1_AfterSelect (sic, I changed the name to 
    // treeViewSearchWorker) and by tabControlWorker_SelectedIndexChanged(). 
    // currentNode is set/overwritten on clicking a node and saved in a form var.
    // The active tab page is always known via the TabControl's SelectedIndex
    // property, so there is no need to pass in either value.
    private void UpdateActiveTabForNode() {
        int ActiveTabPage = tabControlWorker.SelectedIndex;

        switch (ActiveTabPage) {
            case (int)TabControls.BasicInfo:
                if (tabPageBasicInfo.Controls.Count > 0) {
                    ;// tabPageBasicInfo.Controls.Remove(0);<-- What to pass in here?
                }
                    BasicInfoPseudoTab bipt = new BasicInfoPseudoTab(currentNode);
                    tabPageBasicInfo.Controls.Add(bipt);
                tabPageBasicInfo.BringToFront();
                    bipt.Show();
                break;
            case (int)TabControls.ConfidentialInfo:
                ConfidentialInfoPseudoTab cipt = new ConfidentialInfoPseudoTab(currentNode);
                tabPageConfidentialInfo.Controls.Add(cipt);
                cipt.Show();
                break;
            case (int)TabControls.RolesAndSecurity:
                RolesAndSecurityPseudotab raspt = new RolesAndSecurityPseudotab(currentNode);
                    tabPageRolesAndSecurity.Controls.Add(raspt);
                    raspt.Show();
                break;
            case (int)TabControls.InactiveInfo:
                InactiveInformationPseudoTab iipt = new InactiveInformationPseudoTab(currentNode);
                    tabPageInactiveInfo.Controls.Add(iipt);
                    iipt.Show();
                break;
            default: {
                    break;
                    // TODO: Do something?
                }
        }
    }

    private void tabControlWorker_SelectedIndexChanged(object sender, System.EventArgs e) {
        UpdateActiveTabForNode();
    }
}

==== 疑似 tabPages の 1 つとして機能するフォーム:

public partial class BasicInfoPseudoTab : Form {
    String _aNodeName = String.Empty;

    public BasicInfoPseudoTab(String ANodeName) {
        InitializeComponent();
        // Without this, you get "TopLevel control cannot be added to a control"
        this.TopLevel = false;
        this.FormBorderStyle = FormBorderStyle.None;
        this.Visible = true;
        this.Dock = DockStyle.Fill;
        _aNodeName = ANodeName;
        SetDisplayVals();
    }

    private void SetDisplayVals() {
        if (_aNodeName == "NodeBuckingham") {
            textBoxFirstName.Text = "Buckingham";
            textBoxLastName.Text = "Piranha";
            textBoxNickname.Text = "B.P.";
        }
        else if (_aNodeName == "NodeVolcano") {
            textBoxFirstName.Text = "Volcano";
            textBoxLastName.Text = "Jerry";
            textBoxNickname.Text = "V.J.";
        } else if (_aNodeName == "NodeParsons") {
            textBoxFirstName.Text = "Parsons";
            textBoxLastName.Text = "Spalding";
            textBoxNickname.Text = "P.S.";
        } else {
            textBoxFirstName.Text = String.Empty;
            textBoxLastName.Text = String.Empty;
            textBoxNickname.Text = String.Empty;
        }
    }

更新しました:

イベントハンドラーの外側でフォーム変数を宣言し、続行する前にnullでない場合はそれらを破棄することで機能しました。

    string currentNode = string.Empty;
    BasicInfoPseudoTab bipt;
    ConfidentialInfoPseudoTab cipt;
    RolesAndSecurityPseudotab raspt;
    InactiveInformationPseudoTab iipt;

    . . .

    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) {
        currentNode = e.Node.Name;
        UpdateActiveTabForNode();
    }

    private void UpdateActiveTabForNode() {
        int ActiveTabPage = tabControlWorker.SelectedIndex;

        switch (ActiveTabPage) {
            case (int)TabControls.BasicInfo:
                if (null != bipt) {
                    bipt.Dispose();
                }
                bipt = new BasicInfoPseudoTab(currentNode);
                tabPageBasicInfo.Controls.Add(bipt);
                bipt.Show();
                break;
            . . .
4

1 に答える 1

1

必要に応じて、フォームごとに 1 つずつモジュール レベルの変数を使用します。フォームを常に重ねて作成している場合、どのようにクリーンアップするつもりですか? フォームを作成し続けるときは、作業セットのサイズを確認してください。

于 2012-03-23T17:00:05.977 に答える