powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сохранить ссылку на ссылку
18 сообщений из 18, страница 1 из 1
Сохранить ссылку на ссылку
    #38406823
TimeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени!
Поясню контекст задачи.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
class Parent
{
    private ILang  _lang;
    private Child   _child;

    public Parent()
    {
        _child = new Child(_lang);
    }

    public ChooseLang()
    {
         _lang = ...
    }

    public OpenChild()
    {
        _child.ShowDialog();
    }
}


Есть базовое окно, содержащее, к примеру, поле "выбранный язык". При своей инициализации оно инициализирует (но пока не рисует) модальное окно, куда надо передать (через его конструктор) этот самый язык. Прикол в том, что последовательность получается такая:
1. Инициализируем главное и дочернее окно, язык еще не выбран, в дочернее уходит null.
2. Выбираем язык ChooseLang.
3. Открываем дочернее окно. В нем лежит переданный ранее null, т.е. оно не смотрит на текущее значение поля в родительском окне, а хранит первоначально переданное значение.

Вопрос: как сделать так, чтобы передать не значение поля _lang, а ссылку на саму переменную, и если та обновиться, то в дочернем классе мы будем иметь доступ к актуальным данным?

В С++ я бы просто передал адрес поля. В C# можно передать через ref, но это переданное значение я не могу сохранить как поле дочернего объекта (нельзя объявлять данные-члены с модификатором ref).

P.S. это понятно, что надо передавать не через конструктор, а при рисовании окна и т.п. Ну вот такие ограничения, не получится. Большой сложный проект с кучей IoC-контейнеров, динамических конструкторов View и прочего, перелопатить это не реально, все что я могу - что-то передать в конструктор дочернего окна, это должно сохраниться в объекте, а при показе окна - подтянуть актуальные данные.

P.P.S. пока есть одно решение: передавать IEnumerable<ILang>, генерировать его через yield. Работает, но это не красиво, передавать один элемент словно это коллекция. Неужели в .net нет обертки, типа Ref<T> ?
...
Рейтинг: 0 / 0
Сохранить ссылку на ссылку
    #38406866
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeCoderP.S. это понятно, что надо передавать не через конструктор, а при рисовании окна и т.п.
странно как то. Проперти в модальном окне никак не сделать и спокойно получить значение после ShowDialog?
...
Рейтинг: 0 / 0
Сохранить ссылку на ссылку
    #38406885
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeCoder,
Я имхо понял что язык это язык приложения, если это так то это глобальные данные для всего приложения, и с любого места
можно получить к ним доступ из программы в любое время, вы в каждой форме держите поле для этого? - как бы забавно..
для этого подойдет любое глобальное публичное статическое поле- свойство, вообще для таких дел нужно использовать
модель settings
она стандартна вшита в студию, все таки имхо лучше пересмотреть, чем инжектировать через конструктор..
...
Рейтинг: 0 / 0
Сохранить ссылку на ссылку
    #38406927
TimeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ИзопропилПроперти в модальном окне никак не сделать и спокойно получить значение после ShowDialog?
Ну так а как? ShowDialog покажет дочернее окно, в процессе чего у него должно быть актуальное значение поля из родительского окна. Но обратиться напрямую оно туда не может, т.к. ничего о нем не знает (и не должно).
...
Рейтинг: 0 / 0
Сохранить ссылку на ссылку
    #38406929
TimeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то в степинужно использовать
модель settings

Это глобальное хранилище данных, что в данном случае неправильно: ведь речь идет о поле, существующем только в пределах одного класса, и передаваемое во второй. Остальному "миру" эти данные видеть нет смысла.
...
Рейтинг: 0 / 0
Сохранить ссылку на ссылку
    #38406945
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeCoder(и не должно).
конечно. И модальное окно никаких побочных эффектов создавать не должно- спросить что-то у пользователя и вернуть результат. Использование результата - забота вызывающего
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public partial class ParamDialog : Form
{
        public ILang lang { get; set; }

.....

ILang mylang = null;
ParamDialog f = new ParamDialog();
f.lang = mylang;
if (f.ShowDialog() == DialogResult.OK) {
    mylang = f.lang;
}
...
Рейтинг: 0 / 0
Сохранить ссылку на ссылку
    #38406946
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeCoder,
Вы в каком типе храните признак языка, уж не в string ли?
...
Рейтинг: 0 / 0
Сохранить ссылку на ссылку
    #38406952
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,
а пардон, не увидел
...
Рейтинг: 0 / 0
Сохранить ссылку на ссылку
    #38407066
TimeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,
там так не получится, перед показом модального окна что-то в него докинуть. Вызов происходит движком проекта, неявно, где-то в дебрях кода. Как я сказал, единственное, что мне доступно - это передавать параметры через конструктор модального окна. И фактически, мне нужно передать не содержимое ссылочного поля, а его адрес (т.к. содержимое может меняться).
...
Рейтинг: 0 / 0
Сохранить ссылку на ссылку
    #38407095
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeCoder,
попробуйте так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public class Parent
{
    public  ILang  _lang;
    private Child   _child;

    public Parent()
    {
        _child = new Child(this);
    }

    public ChooseLang()
    {
         _lang = ...
    }

    public OpenChild()
    {
        _child.ShowDialog();
    }
}
...
Рейтинг: 0 / 0
Сохранить ссылку на ссылку
    #38407117
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeCoderИ фактически, мне нужно передать не содержимое ссылочного поля, а его адрес

Т.е. ты не можешь обработать результат работы модального окна - правильно понимаю?
...
Рейтинг: 0 / 0
Сохранить ссылку на ссылку
    #38407171
TimeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то в степи,
так не получится по той причине, что модальное окно используется не только здесь. Т.е. оно ничего не должно знать о родителе. Ну можно конечно родителя запрятать за какой-то интерфейс, но это уже огород)
...
Рейтинг: 0 / 0
Сохранить ссылку на ссылку
    #38407177
TimeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PallarisTimeCoderИ фактически, мне нужно передать не содержимое ссылочного поля, а его адрес

Т.е. ты не можешь обработать результат работы модального окна - правильно понимаю?
В родительском окне? Может и могу, надо глянуть, но мне зачем обрабатывать его результат? Тут наоборот, при показе модального окна, оно использует свое поле данных, установленное ранее через конструктор от главного окна (но значение которого надо "перезагрузить").
...
Рейтинг: 0 / 0
Сохранить ссылку на ссылку
    #38407217
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimeCoder,
попробуй так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
    public class Wrapper
    {
        public ILang lang{ get; set; }
    }

class Parent
{
     readonly Wrapper wrap=new Wrapper();
    private Child   _child;

    public Parent()
    {
        _child = new Child(wrap);
    }

    public ChooseLang()
    {
         wrrap.lang = ...
    }

    public OpenChild()
    {
        _child.ShowDialog();
    }
}
...
Рейтинг: 0 / 0
Сохранить ссылку на ссылку
    #38407499
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

топикстартер и просил враппер типа Ref<T> :

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 public class Ref<T> : INotifyPropertyChanged
    {
        private T val;
        public Ref() { }
        public Ref(T val) { this.val = val; }
        public T Value
        {
            get { return val; }
            set { val = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("val")); }
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }
...
Рейтинг: 0 / 0
Сохранить ссылку на ссылку
    #38407522
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,
ну а в чем проблема? можно еще таймер приделать что бы лампочки моргали ))
...
Рейтинг: 0 / 0
Сохранить ссылку на ссылку
    #38407524
Sergey TSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TimeCoderНу можно конечно родителя запрятать за какой-то интерфейс, но это уже огород)

Не огород, а вполне приемлемое решение.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
interface IGetLang
{
  ILang Lang { get; set; }
}

class Parent : IGetLang
{
    private ILang  _lang;
    private Child   _child;

    public Parent()
    {
        _child = new Child(this);
    }

    public ChooseLang()
    {
         _lang = ...
    }

    public OpenChild()
    {
        _child.ShowDialog();
    }

    ILang Lang 
    { 
        get { ... }
        set { ... }
    }
}

class Child
{
    public Child(IGetLang getLang) { ... }
}
...
Рейтинг: 0 / 0
Сохранить ссылку на ссылку
    #38408561
TimeCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всем спасибо за советы, попробую варианты)
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сохранить ссылку на ссылку
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]