2015-06-18 63 views
0

我想在運行時在GUI中顯示任意對象的公共屬性/值。c#winform在運行時檢查對象

是否有一個winform允許用戶查看調試模式下的任何對象的內容?該對象將包含許多字典>,並且能夠在運行時擴展和查看這些列表的內容將會很好。

如果不可用,有沒有辦法實現類似的功能?

感謝

+2

使用'PropertyGrid'控件。 – Yegor

回答

3

PropertyGrid

var form = new Form(); 

form.Controls.Add 
(
    new PropertyGrid() 
    { 
    SelectedObject = new { A = "Hi", B = new [] { 32, 40 } } 
    } 
); 

form.Show(); 

這是從如何調試一個作品很遠,但它可以很容易地修改,以處理您的任何特殊情況。

3

所有你需要做的就是創建一個帶有PropertyGrid的窗體。然後設置選定的對象。

enter image description here

using xxx.CFM.UI.Core; 
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace xxx.CFM.UI.Forms 
{ 
    /// <summary> 
    /// Form used to inspect objects at runtime 
    /// </summary> 
    public partial class frmInspector : BaseForm 
    { 
     #region Properties 

     /// <summary> 
     /// Gets or Sets the 
     /// </summary> 
     public object SelectedObject 
     { 
      get { return propertyGrid.SelectedObject; } 
      set { propertyGrid.SelectedObject = value; } 
     } 

     #endregion Properties 

     #region Constructor 

     /// <summary> 
     /// Constructor 
     /// </summary> 
     public frmInspector(object objectToInspect) 
     { 
      try 
      { 
       InitializeComponent(); 

       this.SelectedObject = objectToInspect; 
      } 
      catch (Exception ex) 
      { 
       UIMessage.DisplayError(ex); 
      } 
     } 

     #endregion Constructor 

     #region Events 

     /// <summary> 
     /// Closes the form 
     /// </summary> 
     /// <param name="sender">object</param> 
     /// <param name="e">args</param> 
     private void btnClose_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       this.Close(); 
      } 
      catch (Exception ex) 
      { 
       UIMessage.DisplayError(ex); 
      } 
     } 

     #endregion Events 
    } 
} 

我在例如網格使用上下文菜單上的期望它下面的數據記錄:

/// <summary> 
    /// Opens the object inspector 
    /// </summary> 
    /// <param name="sender">object</param> 
    /// <param name="e">args</param> 
    private void inspectorMenuItem_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      //Get the payload 
      SectionDataTreeListMenuItemPayload payload = (sender as ToolStripMenuItem).Tag as SectionDataTreeListMenuItemPayload; 

      if (payload == null || payload.DataRow == null) 
       return; 

      using (frmInspector frmInspector = new frmInspector(payload.DataRow)) 
       frmInspector.ShowDialog(); 
     } 
     catch (Exception ex) 
     { 
      UIMessage.DisplayError(ex); 
     } 
    } 

另一個小竅門,你所能做的就是確保表單僅當通過使用「編譯器指令」使用下面的代碼在調試模式下構建時纔可用。 (如果你希望它只用於調試當然)

#if DEBUG 

       //Add object inspector menu item if built in debug mode 
       ToolStripMenuItem inspectorMenuItem = new ToolStripMenuItem(); 
       inspectorMenuItem.Text = "Inspect Object"; 
       inspectorMenuItem.Image = Properties.Resources.Inspect24x24; 
       inspectorMenuItem.Click += inspectorMenuItem_Click; 
       inspectorMenuItem.Tag = payload; 
       contextMenuStrip.Items.Add(inspectorMenuItem); 

#endif