8

2 つの項目を持つプロパティ グリッドがあります。国と都市。データベースに 1 つのテーブルがあります: LocationId、Title、ParentId を保存する CountryCityTable。国の場合はparentId = 0、都市の場合はcountryidです。

私のプロパティ グリッドでは、これらを使用して 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;

ここで、ユーザーがプロパティグリッドで国のタイトルを変更したときに、都市のリストが更新されたときに必要です(これらの親 ID = 国 ID の都市を表示するだけです)。

また、私のクラスでは、コード ( Db.LoadLocations(1,20); ) の Number 20 を選択した国 ID に変更するにはどうすればよいですか?

ありがとう。

4

1 に答える 1

3

次のようなものを実装する必要がありますINotifyPropertyChanged

MicrosoftINotifyPropertyChangeドキュメント

言い換えれば、1つのプロパティを偶然見つけたときに、何らかのイベントを発生させる必要があります。私が覚えている限り、プロパティグリッドは、そのタイプのイベント/インターフェイスを自動的にチェックし、イベントが発生したときに正しいプロパティノードを更新します。

重要な部分は次のとおりです。

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 に答える