.NET Propertygrid обновляет проблему - PullRequest
0 голосов
/ 31 марта 2010

Сетка свойств не показывает новое значение выбранного объекта.

Например:

o.val = "1";
pg.SelectedObject = o;
o.val = "2";
pg.Refresh();

Свойство в сетке свойств по-прежнему равно 1; Он меняется только если вы нажмете на это свойство.

Или вот так:

o.val = "1";
pg.SelectedObject = o;
o.val = "2";
pg.SelectedObject = o;

, но в этом случае фокус будет изменен на PropertyGrid.

Ответы [ 2 ]

1 голос
/ 31 марта 2010

Потому что вы просто не дали некоторый код, вот рабочий пример.Просто поместите Button и PropertyGrid на форму.

using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApplication
{
    public partial class FormMain : Form
    {
        Random rand;
        MyObject obj;

        public FormMain()
        {
            InitializeComponent();

            rand = new Random();
            obj = new MyObject();

            propertyGrid1.SelectedObject = obj;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            obj.MyValue = rand.Next();
            obj.IsEnabled = !obj.IsEnabled;
            obj.MyText = DateTime.Now.ToString();

            propertyGrid1.Refresh();
        }
    }

    public class MyObject : INotifyPropertyChanged
    {
        private int _MyValue;
        public int MyValue
        {
            get
            {
                return _MyValue;
            }
            set
            {
                _MyValue = value;
                NotifyPropertyChanged("MyValue");
            }
        }

        private string _MyText;
        public string MyText
        {
            get
            {
                return _MyText;
            }
            set
            {
                _MyText = value;
                NotifyPropertyChanged("MyText");
            }
        }

        private bool _IsEnabled;
        public bool IsEnabled
        {
            get
            {
                return _IsEnabled;
            }
            set
            {
                _IsEnabled = value;
                NotifyPropertyChanged("IsEnabled");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
    }
}
1 голос
/ 31 марта 2010

Как я уже говорил в своем комментарии, вашего кода недостаточно для понимания вашей проблемы. Представлено так, как это должно работать. Вот мой, который хорошо работает:

public class Target
{
    private int _myInt = 1;
    public int MyInt { set; get; }

    public static Target target = new Target();
}

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();

        Button button = new Button()
        {
            Text = "Click me",
            Dock = DockStyle.Bottom
        };

        Form form = new Form
        {
            Controls = {
                new PropertyGrid {
                    SelectedObject = Target.target,
                    Dock = DockStyle.Fill,
                },
                button
            }
        };

        button.Click += new EventHandler(button_Click);
        Application.Run(form);
    }

    static void button_Click(object sender, EventArgs e)
    {
        Target.target.MyInt = 2;
        Form form = Form.ActiveForm;
        (form.Controls[0] as PropertyGrid).Refresh();
    }
}

Вызов Refresh () фактически восстанавливает сетку. Удалите его, и вы увидите изменения только после того, как нажмете свойство.

...