1

ユーザーが PropertyGrid でテキストまたはブール値を変更するとflagModified=true;、イベント ハンドラーで設定します。

private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
    {
        propertyGrid1.Refresh();
        PropertyChanged(true);
    } 

[保存] ボタンが有効になります。

エディターとフォーム (以下のクラスを参照) を使用して、Propertygrid の値の 1 つを編集します。それは私のクラスのオブジェクトです。オブジェクトがエディターで変更され、エディターが閉じられた後、オブジェクトの値を新しい値 (値 = frm.m_DS;) に再割り当てします。すべて正常に動作しますが、一瞬です。この場合、PropertyValueChanged は発生しません。PropertyValueChanged イベントを使用して、すべてのプロパティをファイルに保存するボタン「保存」を有効にします。値が変更されたイベントをキャッチして [保存] ボタンを有効にするにはどうすればよいですか?

public class DataProviderEditor : UITypeEditor
    {

        public override Object EditValue(
          ITypeDescriptorContext context,
          IServiceProvider provider,
          Object value)
        {
            if ((context != null) && (provider != null))
            {
                IWindowsFormsEditorService svc =
                  (IWindowsFormsEditorService)
                  provider.GetService(typeof(IWindowsFormsEditorService));

                if (svc != null)
                {
                    using (DatasourceForm frm =
                      new DatasourceForm((MyDatasource)value))
                    {
                        if (svc.ShowDialog(frm) == DialogResult.OK)
                        {
                            value = frm.m_DS;
                        }
                    }
                }
            }

            return base.EditValue(context, provider, value);
        }
4

2 に答える 2

3

PropertyGrid.PropertyValueChangedイベントに関するドキュメントに欠陥があることに気付きました。ユーザーが値を変更した場合にのみイベントが発生することは言及されていません。PropertyValueChangedEventArgsこれは、次のように書かれているドキュメントを確認するとわかります。

PropertyValueChanged イベントは、ユーザーが PropertyGrid で GridItem として指定されているプロパティの値を変更したときに発生します。

できることは、PropertyValueChangedによって参照されるオブジェクトにイベントを追加することですPropertyGrid。次のようにコーディングできます。

public class BrowsedObject
{
    public event EventHandler PropertyValueChanged;

    private void OnPropertyValueChanged(object sender, EventArgs e)
    {
        EventHandler eh = PropertyValueChanged;
        if (eh != null)
            eh(sender, e);
    }

    private string someProperty;
    public new string SomeProperty
    {
        get { return someProperty; }
        set
        {
            someProperty = value;
            OnPropertyValueChanged(this, EventArgs.Empty);
        }
    }
}

SomePropertyオブジェクトに新しい値が割り当てられるたびに が発生しますPropertyValueChanged[保存] ボタンなどを有効にするこのイベント ロジックに接続できます。

または

PropertyChanged(true);コードからオブジェクトのプロパティを変更するたびに呼び出してみませんか。

于 2013-02-27T11:58:38.917 に答える
0

非常に単純な「自動更新」スタッフの場合、次のことができます。

propertyGrid1.SelectedObject = propertyGrid1.SelectedObject;

うまくいったようで、変化が見られます。

于 2014-02-20T09:15:36.230 に答える