Как очистить пользовательский элемент управления от winform? - PullRequest
0 голосов
/ 03 октября 2018

Это, вероятно, основной вопрос, но я не могу найти ответы, потому что термины являются общими.

Я создаю приложение WinForm.Его цель - настроить память в определенном чипе.Я думаю, что лучший способ организовать приложение - иметь пользовательский элемент управления для каждого типа микросхемы, полученный из общего родительского класса.Думайте о детях как о «iphone», «android» и «blackberry», происходящих из родительского класса «phone».

VS2017 В Designer есть панель, где я хочу, чтобы элемент управления был.При запуске я генерирую объект базового класса и добавляю его на панель.Когда я нажимаю кнопку, старый объект удаляется и заменяется новым.У каждого класса есть только один элемент управления, метка с отличительным текстом.

Проблема в том, что после нажатия кнопки я вижу оба текста.Коллекция Controls панели имеет только один элемент, но я вижу текст из обоих объектов.Я пытался обновить, обновить и сделать недействительными с одинаковыми результатами.

Что мне нужно сделать, чтобы старый текст "ушёл", поэтому единственное, что я вижу, это последний объект?

    private ChipMemBase ChipMemControl = new ChipMemBase();
    public Form1()
    {
        InitializeComponent();
        //tbFeedback.Text = string.Format(fmtString, 0, 1, 2, 3, 4, 5);
        cbChipName.SelectedIndex = 0;
        tbVersion.Text = Version;
        OriginalWindowColor = tbFeedback.BackColor;
        ShowChipMemControl();
        PrintToFeedback(Version);
    }
    private void ShowChipMemControl()
    {
        var ctl = pnlChipMem.GetChildAtPoint(new Point(5,5));
        if (null != ctl)
        {
            if (ctl != ChipMemControl)
            {
                pnlChipMem.Controls.Remove(ctl);
                ctl.Dispose();
                pnlChipMem.Update();
                Refresh();
            }
        }
        if (null != ChipMemControl)
        {
            pnlChipMem.Controls.Add(ChipMemControl);
        }
    }
    private void btnMakeChipMemory_Click(object sender, EventArgs e)
    {
        ChipMemControl = new ChipMemGen2();
        ShowChipMemControl();
    }

Снимки экрана до и после нажатия кнопки "Создать"

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Понял.Проблема была в наследовании, а не в поведении окон.Элемент управления lblDefault в базовом классе, несущий неудобный текст, все еще присутствовал в дочернем классе.Мне пришлось сделать его Public в базовом классе и удалить его в конструкторе дочернего класса:

        InitializeComponent();
        Controls.Remove(lblDefault);
        lblDefault.Dispose();
        lblDefault = null;

Ключом к этой статье и проекте было: dynamic-and-remove-a-user-control

0 голосов
/ 03 октября 2018

Ваш ShowChipMemControl получает элемент управления в точке 5,5 и проверяет, является ли он ChipMemControl, а затем удаляет его.

Я предполагаю, что причина, по которой он не удаляется, заключается в том, что элемент управления в точке 5,5 не является ChipMemControl.

Вы можете использовать:

pnlChipMem.Controls.Clear()

, чтобы удалить все элементы управления

Или:

ChipMemControl cmc = pnlChipMem.Controls.OfType<ChipMemBase>().FirstOrDefault();
if (cmc != null)
{
    pnlChipMem.Controls.Remove(cmc);
    cmc.Dispose();
}

Только удалитьпервый экземпляр ChipMemBase на панели pnlChipMem.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...