Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сохранить ссылку на ссылку / 18 сообщений из 18, страница 1 из 1
25.09.2013, 09:49
    #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
25.09.2013, 10:20
    #38406866
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранить ссылку на ссылку
TimeCoderP.S. это понятно, что надо передавать не через конструктор, а при рисовании окна и т.п.
странно как то. Проперти в модальном окне никак не сделать и спокойно получить значение после ShowDialog?
...
Рейтинг: 0 / 0
25.09.2013, 10:31
    #38406885
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранить ссылку на ссылку
TimeCoder,
Я имхо понял что язык это язык приложения, если это так то это глобальные данные для всего приложения, и с любого места
можно получить к ним доступ из программы в любое время, вы в каждой форме держите поле для этого? - как бы забавно..
для этого подойдет любое глобальное публичное статическое поле- свойство, вообще для таких дел нужно использовать
модель settings
она стандартна вшита в студию, все таки имхо лучше пересмотреть, чем инжектировать через конструктор..
...
Рейтинг: 0 / 0
25.09.2013, 10:58
    #38406927
TimeCoder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранить ссылку на ссылку
ИзопропилПроперти в модальном окне никак не сделать и спокойно получить значение после ShowDialog?
Ну так а как? ShowDialog покажет дочернее окно, в процессе чего у него должно быть актуальное значение поля из родительского окна. Но обратиться напрямую оно туда не может, т.к. ничего о нем не знает (и не должно).
...
Рейтинг: 0 / 0
25.09.2013, 11:00
    #38406929
TimeCoder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранить ссылку на ссылку
Где-то в степинужно использовать
модель settings

Это глобальное хранилище данных, что в данном случае неправильно: ведь речь идет о поле, существующем только в пределах одного класса, и передаваемое во второй. Остальному "миру" эти данные видеть нет смысла.
...
Рейтинг: 0 / 0
25.09.2013, 11:11
    #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
25.09.2013, 11:11
    #38406946
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранить ссылку на ссылку
TimeCoder,
Вы в каком типе храните признак языка, уж не в string ли?
...
Рейтинг: 0 / 0
25.09.2013, 11:14
    #38406952
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранить ссылку на ссылку
Где-то в степи,
а пардон, не увидел
...
Рейтинг: 0 / 0
25.09.2013, 12:38
    #38407066
TimeCoder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранить ссылку на ссылку
Изопропил,
там так не получится, перед показом модального окна что-то в него докинуть. Вызов происходит движком проекта, неявно, где-то в дебрях кода. Как я сказал, единственное, что мне доступно - это передавать параметры через конструктор модального окна. И фактически, мне нужно передать не содержимое ссылочного поля, а его адрес (т.к. содержимое может меняться).
...
Рейтинг: 0 / 0
25.09.2013, 12:56
    #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
25.09.2013, 13:09
    #38407117
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранить ссылку на ссылку
TimeCoderИ фактически, мне нужно передать не содержимое ссылочного поля, а его адрес

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

Т.е. ты не можешь обработать результат работы модального окна - правильно понимаю?
В родительском окне? Может и могу, надо глянуть, но мне зачем обрабатывать его результат? Тут наоборот, при показе модального окна, оно использует свое поле данных, установленное ранее через конструктор от главного окна (но значение которого надо "перезагрузить").
...
Рейтинг: 0 / 0
25.09.2013, 14:11
    #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
25.09.2013, 16:29
    #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
25.09.2013, 16:42
    #38407522
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранить ссылку на ссылку
Изопропил,
ну а в чем проблема? можно еще таймер приделать что бы лампочки моргали ))
...
Рейтинг: 0 / 0
25.09.2013, 16:43
    #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
26.09.2013, 15:09
    #38408561
TimeCoder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранить ссылку на ссылку
всем спасибо за советы, попробую варианты)
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сохранить ссылку на ссылку / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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