Nano Hash - криптовалюты, майнинг, программирование

Доступ к ParentForm из UserControl

Программа, которую я пишу, включает консоль. Я создал UserControl под названием Console. Этот класс консоли имеет несколько фоновых рабочих процессов, выполняющих различные задачи. Проблема, с которой я столкнулся, заключается в том, что если я помещаю этот элемент управления в форму, а затем закрываю ее, я иногда сталкиваюсь с проблемами, когда потоки BackgroundWorker вызывают вызовы удаленных объектов.

На основе этого потока мне нужно остановить закрытие формы и сам обработаю запрос на закрытие. У меня большая часть этого написана успешно, но основная проблема, с которой я сталкиваюсь, заключается в подписке на событие FormClosing ParentForm.

Я пытался использовать this.ParentForm, но не могу найти подходящего места, где это не равно нулю.

Конечно, я не могу сделать это в конструкторе, так как он генерируется в данный момент.

Я также не могу использовать это в событии ParentChanged, как указано в этой теме. Когда это срабатывает, this.Parent больше не равно нулю, но это не this.ParentForm. Я понимаю, что иногда это может быть, но, например, в настоящее время я сижу в элементе управления вкладками, так что это не совсем то, что я хочу.

Тогда у нас также есть это предложение, чтобы попытаться подключиться к функции this.Load (я ссылаюсь на второй ответ, а не на выбранный), но опять же, this.ParentForm здесь равно нулю. Как и раньше, this.Parent имеет значение, но это не совсем то, что мне нужно.

Наконец, я подумал, что нашел решение своей проблемы, когда наткнулся на этот поток предлагает переопределить OnCreateControl, но опять же... не повезло, оба пусты.

После того, как форма загружена, я добавил кнопку, которую я могу нажать, и в этот момент я смог определить, что this.ParentForm действительно заполняется правильно.

Мой вопрос: где я могу получить this.ParentForm UserControl, где он не равен нулю, чтобы я мог подписаться на его события?

Изменить: добавление части моего кода по запросу LarsTech:

Результат этого кода:

This.Parent имеет значение

This.ParentForm имеет значение null

private MyConsole(string COMPort)
{
    // I do this so that the console window is created by the time I have started my Background Workers
    this.CreateHandle();

    // Generate the form
    InitializeComponent();
        
    // set the COM Port Name
    _COMPort = COMPort;
    ReadOnly = true;
    ActiveCloseRequest = false;

    // This just creates 1 or 2 background workers
    StartBackgroundWorkers();

    this.ParentChanged += MyConsole_ParentChanged;            
}
void MyConsole_ParentChanged(object sender, EventArgs e)
{
    if (this.Parent == null)
    {
        Console.WriteLine("This.Parent is null");
    }
    else
    {
        Console.WriteLine("This.Parent has a value");
    }
    if (this.ParentForm == null)
    {
        Console.WriteLine("This.ParentForm is null");
    }
    else
    {
        Console.WriteLine("This.ParentForm has a value");
    }
}

  • Как это помечено как asp и wpf? Это Silverlight или вы можете указать, какую структуру пользовательского интерфейса вы используете, потому что это больше похоже на winforms. 25.08.2015
  • Извините, это была ошибка, вы совершенно правы. Я изменил его. 25.08.2015
  • Сделайте так, чтобы ваш элемент управления наследовал ISupportInitialize, что заставит дизайнера использовать вызовы BeginInit и EndInit при создании вашего элемента управления. Затем вы можете получить родительскую форму, используя this.FindForm() в методе EndInit. 25.08.2015
  • Я уже наследую от UserControl, поэтому я не могу также наследовать от ISupportInitialize, не так ли? 25.08.2015
  • Да, это интерфейс, а не конкретный класс, вы можете наследовать от нескольких интерфейсов, но только от одного конкретного класса, это будет выглядеть как public MyControl : UserControl, ISupportInitialize { ... } 25.08.2015
  • Ах, я должен был это знать. Меня сбило с толку то, что вы сказали «наследовать», я не знал, что это также применяется при использовании интерфейсов. Я попробую. 25.08.2015
  • Я вижу, что несколько других UserControl, которые я создал, вызывают BeginInit() и EndInit, но по какой-то причине этого не происходит. Я не удалял их вручную, хотя, возможно, сделал что-то еще, что избавило бы от них. Любая идея? 25.08.2015
  • Обязательно удалите элемент управления, перестройте свой проект, а затем снова добавьте его в форму, это не сработает, если вы просто измените его, не добавляя повторно. 25.08.2015
  • Можем ли мы перейти к чату? chat.stackoverflow.com/rooms/87914/ 25.08.2015
  • Прошу прощения, не могу, работаю. 25.08.2015
  • Мне непонятно, почему свойство ParentForm нельзя использовать в событии ParentChanged. Я почти уверен, что это работает. 25.08.2015
  • Я только что убедился, что this.Parent не null, а this.ParentForm есть. Не уверен, почему это так. 25.08.2015
  • Вы должны были бы показать нам тот код, который делает это. 25.08.2015
  • Извините, я имел в виду, что я подтвердил в событии ParentChanged, что this.Parent не null, а this.ParentForm. Мой код для этого просто проверяет, являются ли они нулевыми или нет, и печатает строку, указывающую в любом случае. 25.08.2015
  • Опять же, вам придется показать нам код, который это делает. 25.08.2015
  • Сделанный. Может ли создание дескриптора иметь какое-либо отношение к этому? 25.08.2015
  • Я не могу воссоздать вашу проблему, но я бы не стал создавать дескриптор вручную. Я, вероятно, предпочел бы запустить ваши фоновые рабочие процессы в этом событии ParentChanged, убедившись, что 1) ParentForm не равен нулю и 2) рабочие процессы еще не запущены. 25.08.2015
  • Закомментировал создание ручки, а так же запуск воркеров. Ничего не изменилось, у меня все еще есть значение This.Parent, а значение This.ParentForm равно null. 25.08.2015
  • Если ваш Parent имеет значение, но ParentForm имеет значение null, это странно. Я получаю значения как для Parent, так и для ParentForm. Как вы создаете этот контроль? Очевидно, вы не используете конструктор, поскольку он имеет параметр в конструкторе. 25.08.2015
  • Я считаю, что он был создан через конструктор, я просто добавил параметр в конструктор. Я добавил новый UserControl, назвал его MyConsole, прикрепил к этому элементу управления RichTextBox, а затем просто зашел в класс MyConsole и внес много изменений в него. 25.08.2015
  • Я имел в виду, что вы не помещаете этот UserControl в форму с помощью дизайнера — он вызовет исключение без конструктора без параметров. Так как же этот UserControl помещается в форму? Используйте знак @ в StackOverflow, чтобы сигнализировать пользователю в комментариях. 25.08.2015
  • @LarsTech Я думал, ты получишь уведомление, когда будешь последним комментарием. Извини за это! Правильно: сначала я делаю MyConsole console = new MyConsole("COM7"), затем у меня есть другая форма, на которой есть элемент управления вкладками. Затем я создаю новую вкладку и делаю TabPage.Controls.Add(console);, а затем добавляю эту вкладку в tabcontrol. Есть смысл? 25.08.2015
  • Ну, суть в том, что код, который вы разместили, не воспроизводит проблему. Попробуйте воссоздать проблему в новом проекте и, если это произойдет, опубликуйте этот код. 26.08.2015

Ответы:


1

Вы пытались вместо этого выполнить очистку внутри метода Dispose() UserControl? Обычно это более логичное место для этого, так как при закрытии формы будут удалены его дочерние элементы управления.

К сожалению, автоматически сгенерированный шаблон пользовательского элемента управления помещает метод Dispose() в связанный файл .Designer.cs. Но вместо этого вы можете переместить метод в свой основной файл и изменить его, чтобы выполнить очистку.

25.08.2015
  • Это метод, который я в итоге использовал, я переместил Dispose в свой файл и обработал его оттуда. 23.09.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..