2010-03-31 85 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

我無法重現您的問題。你的代碼在我的示例中運行良好。如果網格尚未第一次顯示,則甚至不需要刷新。也許你應該發佈一些我們可以測試的代碼。 – 2010-03-31 11:38:20

回答

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

對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 2012-07-03 13:09:34