Как обновить значения элемента propertygrid при изменении другого элемента в winform c#?

у меня есть сетка свойств с 2 элементами. Страна И Города. У меня есть 1 таблица в базе данных : CountryCityTable, которые сохраняют LocationId , Title, ParentId. Для стран parentId = 0, а для городов-countryid.

в моем propertygrid я использую их и показываю в 2 элементах combobox. Пожалуйста, смотрите мой код:

namespace ProGrid
{
    public class KeywordProperties
    {
        [TypeConverter(typeof(CountryLocationConvertor))]
        public string CountryNames { get; set; }

        [TypeConverter(typeof(CityLocationConvertor))]
        public string CityNames { get; set; }
    }
}

и

namespace ProGrid
{
    public class CountryLocationConvertor : StringConverter 
    {
        public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
        {
            return true;
        }

        public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
        {            
            HumanRoles Db = new HumanRoles();
            List<LocationsFieldSet> Items = new List<LocationsFieldSet>();
            Items = Db.LoadLocations(0,0);
            string[] LocationItems = new string[Items.Count];
            int count = 0;
            foreach (LocationsFieldSet Item in Items)
            {
                LocationItems[count] = Item.Title;
                count++;
            }
            return new StandardValuesCollection(LocationItems);
        }

        public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
        {
            return true;//false : If you want the user to be able to type in a value that is not in the drop-down list.
        }
    }

    public class CityLocationConvertor : StringConverter
    {
        public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
        {
            return true;
        }

        public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
        {
            HumanRoles Db = new HumanRoles();
            List<LocationsFieldSet> Items = new List<LocationsFieldSet>();
            Items = Db.LoadLocations(1,20);
            string[] LocationItems = new string[Items.Count];
            int count = 0;
            foreach (LocationsFieldSet Item in Items)
            {
                LocationItems[count] = Item.Title;
                count++;
            }
            return new StandardValuesCollection(LocationItems);
        }

        public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
        {
            return true;
        }
    }
}

и

KeywordProperties Kp = new KeywordProperties();
myPropertyGrid.SelectedObject = Kp;

Теперь, я хочу, когда пользователь изменил название страны в propertygrid, список городов обновлен(просто отобразить городов, что атрибутом parentId этих = countryid).

кроме того, в моем классе, как я могу изменить номер 20 в мой код(Db.LoadLocations (1,20);) для выбранного идентификатора страны ?

спасибо.

1 ответов


вам нужно будет реализовать что-то похожее на INotifyPropertyChanged

Microsoft INotifyPropertyChange Документация

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

важная часть есть:

private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

и

public bool MyBoolProperty
{
    get { return  myBoolField; }
    set
    {
        myBoolField = value;
        NotifyPropertyChanged();
    }
}

если вы хотите сделать что-то, что не охватывается PropertyGrid, вам просто нужно зарегистрировать свой собственный метод в PropertyChanged событие и делать все, что угодно.