Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Не могу разобраться со списковым свойством в Prope Добавлено: 13.12.10 21:34  

Автор вопроса:  Luft-on
Есть у меня такой себе класс, в нём есть код:

        private List<Account> _accounts;

        [DisplayName(@"Аккаунты")]
        public List<Account> Accounts
        {
            get { return _accounts; }
            set
            {
                _accounts = value;
            }
        }

        [DisplayName(@"Аккаунт")]
        public class Account
        {
            [DisplayName(@"Домен")]
            public string Domain { get; set; }
            [DisplayName(@"Пользователь")]
            public string UserName { get; set; }
            [DisplayName(@"Пароль")]
            [PasswordPropertyTextAttribute(true)]
            public string UserPassword { get; set; }

            public Account(){}

            public Account(string userName, string userPassword, string domain)
            {
                UserName = userName;
                UserPassword = userPassword;
                Domain = domain;
            }

            public override string ToString()
            {
                return string.Format("{0}:{1}@{2}", UserName, new String('*', UserPassword.Length), Domain);
            }
        }


Когда я изменяю в редакторе коллекций свойство Accounts, то такое впечатление что не происходит событие, которое должно вызывать конструкцию set у свойства Accounts, ибо если поставить в этом месте бряку, то программа не останавливается. А мне как раз это и нужно - сохранять изменения в настройки.
Почему так? Заранее спасибо за ответ!

Ответить

  Ответы Всего ответов: 11  

Номер ответа: 1
Автор ответа:
 Luft-on



Вопросов: 3
Ответов: 12
 Профиль | | #1 Добавлено: 13.12.10 21:47
Забыл сказать, экземпляр этого класса (внешнего) будет использоваться в качестве свойства SelectedObject у объекта PropertyGrid.

Ответить

Номер ответа: 2
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #2 Добавлено: 13.12.10 21:53
  1. UserName = userName;

мб надо юзать
  1. this.UserName = userName;
?

Ответить

Номер ответа: 3
Автор ответа:
 Luft-on



Вопросов: 3
Ответов: 12
 Профиль | | #3 Добавлено: 13.12.10 21:57
мб надо юзать this.UserName = userName;


Это почему же? И какое отношение имеет к свойству Accounts? Но я всё же попробую )

Ответить

Номер ответа: 4
Автор ответа:
 Luft-on



Вопросов: 3
Ответов: 12
 Профиль | | #4 Добавлено: 13.12.10 22:18
Попробовал - ноль на массу! Ещё варианты?

Ответить

Номер ответа: 5
Автор ответа:
 Luft-on



Вопросов: 3
Ответов: 12
 Профиль | | #5 Добавлено: 13.12.10 23:03
Попробовал - ноль на массу! Ещё варианты?

Ответить

Номер ответа: 6
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #6 Добавлено: 14.12.10 03:51
Не понятно о каком редакторе речь идет.
Это UserControl со свойством? И ты в дизайнере меняешь свойство?
Бряк в этом случае не срабатывает, потому что отладчик в этот момент не работает.

Ответить

Номер ответа: 7
Автор ответа:
 Luft-on



Вопросов: 3
Ответов: 12
 Профиль | | #7 Добавлено: 14.12.10 14:04
Artyom пишет:
Не понятно о каком редакторе речь идет.

Стандартный редактор коллекций предоставляемый обычным PropertyGrid'ом
Artyom пишет:
Это UserControl со свойством? И ты в дизайнере меняешь свойство?

Нет, это экземпляр моего класса, меняю значения свойств в PropertyGrid.

Ответить

Номер ответа: 8
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #8 Добавлено: 14.12.10 14:29
Для изменения содержимого List можно вызывать методы .Add/Remove и set-метод срабатывать в этом случае не будет, надеюсь, не нужно объяснять почему.

Если хочешь отслеживать изменения List'а, используй вместо него ObservableCollection

Ответить

Номер ответа: 9
Автор ответа:
 Luft-on



Вопросов: 3
Ответов: 12
 Профиль | | #9 Добавлено: 14.12.10 18:12
.NET Framework
Supported in: 4, 3.5, 3.0

А хотелось бы в 2.0 иметь возможность писать.

Ответить

Номер ответа: 10
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #10 Добавлено: 14.12.10 20:43
Пиши свой ObservableCollection под 2.0, ищи готовую, или носи с собой сборку 3.0, в которой она лежит

Ответить

Номер ответа: 11
Автор ответа:
 Luft-on



Вопросов: 3
Ответов: 12
 Профиль | | #11 Добавлено: 16.12.10 03:30
Если кого ещё интересует, то решением для меня оказался такой вот код:
  1.  
  2.         public delegate void ChangedEventHandler(object sender, EventArgs e);
  3.  
  4.         public class AccountCollection : Collection<Account>
  5.         {
  6.             public event ChangedEventHandler Changed;
  7.  
  8.             protected virtual void OnChanged(EventArgs e)
  9.             {
  10.                 if (Changed != null) Changed(this, e);
  11.             }
  12.  
  13.             protected override void InsertItem(int index, Account item)
  14.             {
  15.                 base.InsertItem(index, item);
  16.                 OnChanged(EventArgs.Empty);
  17.             }
  18.  
  19.             protected override void RemoveItem(int index)
  20.             {
  21.                 base.RemoveItem(index);
  22.                 OnChanged(EventArgs.Empty);
  23.             }
  24.  
  25.             protected override void SetItem(int index, Account item)
  26.             {
  27.                 base.SetItem(index, item);
  28.                 OnChanged(EventArgs.Empty);
  29.             }
  30.  
  31.             protected override void ClearItems()
  32.             {
  33.                 OnChanged(EventArgs.Empty);
  34.                 base.ClearItems();
  35.             }
  36.  
  37.             public override string ToString()
  38.             {
  39.                 var s = "";
  40.                 foreach (var account in this)
  41.                 {
  42.                     s += account.ToWithPasswordString() + "|";
  43.                 }
  44.                 return s.Trim('|');
  45.             }
  46.         }
  47.  
  48.  
  49.         [DisplayName(@"Аккаунты")]
  50.         public AccountCollection Accounts { get; set; }
  51.  
  52.         [DisplayName(@"Аккаунт")]
  53.         public class Account
  54.         {
  55.             [DisplayName(@"Домен")]
  56.             public string Domain { get; set; }
  57.             [DisplayName(@"Пользователь")]
  58.             public string UserName { get; set; }
  59.             [DisplayName(@"Пароль")]
  60.             [PasswordPropertyTextAttribute(true)]
  61.             public string UserPassword { get; set; }
  62.  
  63.             public Account()
  64.             {
  65.                 UserName = "";
  66.                 UserPassword = "";
  67.                 Domain = "";
  68.             }
  69.  
  70.             public Account(string userName, string userPassword, string domain)
  71.             {
  72.                 UserName = userName;
  73.                 UserPassword = userPassword;
  74.                 Domain = domain;
  75.             }
  76.  
  77.             public string ToWithPasswordString()
  78.             {
  79.                 var s = "";
  80.                 if (string.IsNullOrEmpty(UserName)) return "Не указано имя пользователя";
  81.                 s += UserName;
  82.                 if (!string.IsNullOrEmpty(UserPassword)) s += ":" + UserPassword;
  83.                 if (!string.IsNullOrEmpty(Domain)) s += "@" + Domain;
  84.                 return s;
  85.             }
  86.  
  87.             public override string ToString()
  88.             {
  89.                 var s = "";
  90.                 if (string.IsNullOrEmpty(UserName)) return "Не указано имя пользователя";
  91.                 s += UserName;
  92.                 if (!string.IsNullOrEmpty(UserPassword)) s += ":" + new String('*', UserPassword.Length);
  93.                 if (!string.IsNullOrEmpty(Domain)) s += "@" + Domain;
  94.                 return s;
  95.             }
  96.         }

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам