Должен ли я удалить форму, назначенную TabPage, а затем добавить новую, или я могу получить доступ к существующей, чтобы динамически изменять значения, которые она содержит? - PullRequest
0 голосов
/ 23 марта 2012

Я динамически назначаю формы вкладкам.Он работает нормально, за исключением случаев, когда я пытаюсь назначить обновленную версию формы (с различными текстовыми значениями, назначенными для элементов управления) на вкладке.Я на самом деле немного удивлен, что он не падает, когда я создаю несколько экземпляров формы и присваиваю их вкладке (если новые просто укладываются поверх старых, вы можете подумать, что новый будетсверху и новые значения видны).

Итак ... что мне нужно сделать, чтобы удалить предыдущую форму, которую я добавил на вкладку перед добавлением новой версии?Или я могу получить доступ к существующей форме и изменить ее значения.

Я думаю, было бы понятнее, если бы я только показал код:

Основная форма:

    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();
    }
}

==== Форма, которая служит одной из псевдо-вкладок. Страницы:

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;
        }
    }

Обновлено:

Я заработал, объявив переменные формы вне обработчика событий и избавившись от них, если они не былиноль, прежде чем продолжить.

    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;
            . . .

1 Ответ

1 голос
/ 23 марта 2012

Как вы хотите, используйте переменные уровня модуля, по одной для каждой формы, если null, добавьте новую, иначе как выше. Если вы постоянно создаете формы друг на друге, как вы собираетесь убирать? Проверяйте размер рабочего набора при создании форм.

...