3

私のクラスにはMyCountryMyCityの 2 つのプロパティがあります。このクラスをプロパティ グリッドの sourceobject に設定します。国を選択するときに都市をロードしたい。たとえば、2 つの国データがあります。

Country1
Country2

そしてCountry1については、(都市データ)があります

City11
City12
City13

国 2 については、(都市データ) があります。

city21
City22
City23

プロパティグリッドで選択した国アイテムを変更すると、都市アイテムに都市をロードしたい。つまり、 Country1 を選択すると City アイテムに City11,City12,City13表示され、 Country2を選択すると City アイテムにCity21,Cityy22,City23表示されます。

どうすればできますか?

私のクラスは:

public class KeywordProperties
{
    [TypeConverter(typeof(CountryLocationConvertor))]
    public string MyCountry { get; set; }
    [TypeConverter(typeof(CityLocationConvertor))]
    public string MyCity { get; set; }
}

そして、コンボで表示するために国のデータをロードするために以下のクラスを使用します:

public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
    {            
        HumanRoles Db = new HumanRoles();
        List<LocationsFieldSet> Items = new List<LocationsFieldSet>();
        Items = Db.LoadLocations(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;        
    }
}
4

1 に答える 1

1

ITypeDescriptorContextインターフェイスは、タイプ記述子リクエストが接続されているオブジェクトにアクセスできるようにする と呼ばれるプロパティを提供しますInstance

このプロパティを使用してMyCountry、ユーザーが選択したプロパティの現在の値を確認できます。値に応じて、この国の都市をロードできます。

さらに、MyCountryプロパティのセッターで、新しい値が古い値と異なるかどうかを確認し、その場合はMyCityプロパティをリセットします (国と都市の無効な組み合わせを取得しないようにするため)。

これは小さなコードサンプルです。簡単にするために、両方のプロパティに対して 1 つの型コンバーターのみを使用します。

public class KeywordProperties
{    
  public KeywordProperties()
  {
    MyCountry = "Country1";
  }

  private string myCountry;
  [TypeConverter(typeof(ObjectNameConverter))]
  public string MyCountry
  {
    get { return myCountry; }
    set 
    {
      if (value != myCountry)
        MyCity = "";

      myCountry = value; 
    }
  }

  private string myCity;
  [TypeConverter(typeof(ObjectNameConverter))]
  public string MyCity
  {
    get { return myCity; }
    set { myCity = value; }
  }   
}

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

  public override TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
  {
    KeywordProperties myKeywordProps = context.Instance as KeywordProperties;

    if (context.PropertyDescriptor.Name == "MyCountry")
    {
      List<string> listOfCountries = new List<string>();
      listOfCountries.Add("Country1");
      listOfCountries.Add("Country2");        

      return new StandardValuesCollection(listOfCountries);
    }      

    List<string> listOfCities = new List<string>();
    if (myKeywordProps.MyCountry == "Country1")
    {
      listOfCities.Add("City11");
      listOfCities.Add("City12");
      listOfCities.Add("City13");
    }
    else
    {
      listOfCities.Add("City21");
      listOfCities.Add("City22");
      listOfCities.Add("City23");
    }

    return new StandardValuesCollection(listOfCities);
  }
}

上記の例には、私が気に入らない副作用が 1 つあります。MyCountryプロパティを設定すると、プロパティも設定されMyCityます。

この副作用を回避するには、 のPropertyValueChangedイベントを使用して、PropertyGrid無効な国/都市の選択を処理することもできます。

private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
  if (e.ChangedItem.Label == "MyCountry")
  {
    if(e.ChangedItem.Value != e.OldValue)
      m.MyCity = "";
  }
}

MyCountryこのイベントを使用する場合は、プロパティのセッターのコードを次のように置き換えてください。

myCountry = value; 
于 2012-10-03T17:23:51.313 に答える