Как обновить значения элемента 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
событие и делать все, что угодно.