2010-03-31 2 views
0

Сетка свойств не отображает новое значение выбранного объекта.Ошибка свойства .NET Propertygrid

Например:

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.

+0

Я не могу воспроизвести вашу проблему. Ваш код хорошо работает в моем примере. Если сетка не была отображена в первый раз, Refresh даже не требуется. Возможно, вам следует опубликовать код, который мы можем проверить. –

ответ

1

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

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(); 
    } 
} 

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

1

Причина, по которой вы просто не указали код, вот рабочий пример. Просто наденьте 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)); 
      } 
     } 
    } 
} 
+0

Я думаю, что * osss * отсутствовал, как и я, 'INotifyPropertyChanged'. – Wernight

Смежные вопросы