c# изненение объекта объявленной на главной форме с дочерней формы

Статус: Offline
Реєстрація: 30.03.2007
Повідом.: 1286
c# изненение объекта объявленной на главной форме с дочерней формы

Есть несколько форм. Нужно редактировать объект, объявленный на главной форме в дочерней форме. Заводим в дочерней такой же объект, свойство для доступа к нему, создаем экземпляр формы и копируем с главной туда объект через паблик свойство. Редактируем его как хотим. Закрываем дочернюю форму. Теоретически я то могу забрать этот объект с дочерней формы через свойство, но!!! Я хочу забирать его именно четко в момент закрытия дочерней формы!! Как это лучше сделать? Моя идея следующая: создать статический переключатель isChildFormClosed, поток или таймер который будет отслеживать изменение переключателя на true и в этот момент забирать данные (user = Form2.user), а в дочерней изменять на true этот переключатель перед close(). Вариант работающий, но его недостаток очевиден - доп. поток, соотв. доп. нагрузка. Хотя и поток этот запускать нужно только на время работы дочерней формы. Есть у кого другие
варианты? Я думаю все с такой ситуацией сталкивались?
 
создать статический переключатель isChildFormClosed, поток или таймер который будет отслеживать изменение переключателя на true и в этот момент забирать данные...
Зачем же такой геморрой на ровном месте? Я так понимаю, речь идет не о модальном окне. Тут есть два варианта. Либо дочерняя форма на закрытии записывает свой объект в главную, либо, что более ровно, главная форма на показе формы подписыается на событие закрытия формы и в обработчике забирает измененную копию. А вообще, использовать формы как хранилища каких-то данных это порочная практика.
 
Сделал так: на главной форме создал обработчик события (с стандартной сигнатурой), в котором описал присваивание объекту значения объекта с дочерней формы. В конструктор дочерней делегировал этот обработчик. А там уже связал событие нажатия кнопки ОК с этим обработчиком. Таким образом у меня получилось связать событие дочерней формы с обработчиком события, описанном на форме предке.

Либо дочерняя форма на закрытии записывает свой объект в главную.

а как это сделать если не секрет, с дочерней получить доступ к главной?

главная форма на показе формы подписыается на событие закрытия формы и в обработчике забирает измененную копию.

это интересно, можешь объяснить по-подробнее?

А вообще, использовать формы как хранилища каких-то данных это порочная практика.

А как по другому. Есть конечно вариант сделать мой список объектов статическим с открытым доступом в отдельном классе, тогда я буду иметь доступ к нему с любой формы, но разве это лучше? Второй вариант это работать напрямую с файлами объектов. Но в таком случае мне придеться каждый раз их считывать/записывать/создавать новые/искать, а если у меня уже есть список объектов, то мне придется их сохранять только по выходу из программы и загружать на входе, что проще. 3й вариант это размещать объекты в базе данных, но в моем случае это не приемлимо.
 
а как это сделать если не секрет, с дочерней получить доступ к главной?
Например, передать ссылку через конструктор.

это интересно, можешь объяснить по-подробнее?
Это то, что ты, как я понял, и сделал.

Пусть будет объект, сожержащий только данные и возможно какие-то методы их обработки. А форма получает эти данные и визуализирует/изменяет их. Возможно даже статический класс подойдет или синглтон (это даст больше возможостей - наследоваться, например). Вообще, все зависит от конкретной задачи. Но никогда не нужно мешать все до кучи. Почитай об инкапсуляции, да и об остальных основах ООП. Честно говоря, не могу даже посоветовать, где читать, так как позноавал все опытным путем. То же касается и паттернов программирования - узнал как называются приемы, которыми я пользуюсь уже позже. Возможно сразу стоит почитать и о них.
 
Почитай об инкапсуляции, да и об остальных основах ООП. Честно говоря, не могу даже посоветовать, где читать, так как позноавал все опытным путем. То же касается и паттернов программирования - узнал как называются приемы, которыми я пользуюсь уже позже. Возможно сразу стоит почитать и о них.

Когда пишешь что-то своё всегда кажется что твой случай какой-то уникальный и паттерн подойдет только свой :) У меня тоже самое, кстати, познаю только опытным путём

Например, передать ссылку через конструктор.

а толку, ссылка то будет доступна только в конструкторе

Я так понимаю, речь идет не о модальном окне.
Я хотел сделать модальным, но подумал что так будет некрасиво и как-то несовременно
 
да сделай ты делегат в дочерней форме, а форма родитель пусть прилепит какой-нибудь метод к этому делегату. При закрытии дочерней формы вызываешь делегат и передаешь все необходимые данные.
 
да сделай ты делегат в дочерней форме, а форма родитель пусть прилепит какой-нибудь метод к этому делегату. При закрытии дочерней формы вызываешь делегат и передаешь все необходимые данные.

Я сделал похожим образом, но эта идея получше! Спасибо :клас:
 
Согласен со Shwartz. При вызове конструктора получаему ссылку сохранить в переменную и таким образом тупо работаем с главной формой и не надо ничего возвращаться...
 
Shwartz и AposTol, не совсем пойму, что вы имеете в виду. В главной форме создаю экземпляр дочерней и туда в конструктор передаю ссылку на главную, т.е. с параметром ref? Но я ведь не смогу передать this с параметром ref, т.к. this используется только для чтения.

По-моему всё-таки способ с делегатами и лучше и безопаснее
 
Shwartz и AposTol, не совсем пойму, что вы имеете в виду. В главной форме создаю экземпляр дочерней и туда в конструктор передаю ссылку на главную, т.е. с параметром ref? Но я ведь не смогу передать this с параметром ref, т.к. this используется только для чтения.
Дело в том, что простые типы, такие как double или int нужно передавать с ref, иначе они передаются целиком. А вот большие объекты, такие как классы, передаются ссылкой по-умолчанию. Таким образом, ты просто передаешь его как this. А передав ссылку таким образом и сохранив её в переменную такого же типа, как и главная форма, ты сможешь работать непосредственно с главной формой.
 
Дело в том, что простые типы, такие как double или int нужно передавать с ref, иначе они передаются целиком. А вот большие объекты, такие как классы, передаются ссылкой по-умолчанию. Таким образом, ты просто передаешь его как this. А передав ссылку таким образом и сохранив её в переменную такого же типа, как и главная форма, ты сможешь работать непосредственно с главной формой.

т.е. примерно так?:

class FormChild
{
...
FormMain fm;

FormChild(FormMain f) {fm = f;}
...
}

....
class FormMain
{
...
FormChild fc = new FormChild (this);
...
}
 
т.е. примерно так?
Да, так. Это самый простой вариант. Но правильнее все-таки, чтобы форма-редактор ничего не знала о главной форме. В идеале через публичный интерфейс можно только передать исходный объект и получить изменную копию (например, через событие). В будущем это избавит от потенциальных ошибок в использовании этого редактора и позволит его использовать откуда угодно (т.е. не стоит привязываться к типу какой-то там главной формы), и с этой точки зрения вариант с делегатом выглядит более предпочтительным. В общем, редактор должен быть черным ящиком в месте его использования. Вариант с сохранением ссылки более простой, но при этом страдает инкапсуляция.
 
В общем, редактор должен быть черным ящиком в месте его использования. Вариант с сохранением ссылки более простой, но при этом страдает инкапсуляция.

вот вот, поэтому из двух вариантов все же будет лучше способ с делегатом.

Всем спасибо за помощь! Тему можно закрывать, хотя вдруг еще мысли будут, поэтому пусть пока остается открытой :)
 
Есть несколько форм. Нужно редактировать объект, объявленный на главной форме в дочерней форме.
Как ни странно я прочитал первый пост только сейчас :-) и не понял зачем использовать делегаты, события или что-то еще? Если у тебя есть объект, то передай его в форму, которая модифицирует его, по ссылке через конструктор. После того как изменения произошли и форма закрылась объект у тебя останется модифицированным (ведь он был передан по ссылке).
 
Как ни странно я прочитал первый пост только сейчас :-) и не понял зачем использовать делегаты, события или что-то еще? Если у тебя есть объект, то передай его в форму, которая модифицирует его, по ссылке через конструктор. После того как изменения произошли и форма закрылась объект у тебя останется модифицированным (ведь он был передан по ссылке).

я ж писал что в таком случае объект можно будет изменить только в конструкторе. По другому никак.
 
Да, так. Это самый простой вариант. Но правильнее все-таки, чтобы форма-редактор ничего не знала о главной форме. В идеале через публичный интерфейс можно только передать исходный объект и получить изменную копию (например, через событие).
Ну так а почему нельзя сделать в главной форме публичные интерфейсы или функции для изменения главной формы а всё остальное будет private
 
я ж писал что в таком случае объект можно будет изменить только в конструкторе. По другому никак.


Нужно редактировать объект, объявленный на главной форме в дочерней форме
Ну, передай ссылку на обьект в конструктор дочерней формы, и там присвой ссылку уже, как писали выше:

class ChildForm
{
kakoytoObj redaktiruemiyObj;
public ChildForm(kakoytoObj polu4enniyObj)
{
redaktiruemiyObj = polu4enniyObj;
....
}
....
}
 
Останнє редагування:
Назад
Зверху Знизу