8

我有一个包含 2 个项目的属性网格。国家和城市。我在数据库中有 1 个表:保存 LocationId、Title、ParentId 的 CountryCityTable。对于国家,parentId = 0,对于城市,是 countryid。

在我的 propertygrid 中,我使用这些并显示在 2 个组合框项目中。请看我的代码:

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 的城市)。

另外,在我的课堂上,我如何将我的代码(Db.LoadLocations(1,20);)中的数字 20 更改为选定的国家/地区 ID?

谢谢。

4

1 回答 1

3

您将需要实现类似于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事件中注册你自己的方法,然后做任何你想做的事情。

于 2012-11-18T12:42:06.540 回答