我想在運行時在GUI中顯示任意對象的公共屬性/值。c#winform在運行時檢查對象
是否有一個winform允許用戶查看調試模式下的任何對象的內容?該對象將包含許多字典>,並且能夠在運行時擴展和查看這些列表的內容將會很好。
如果不可用,有沒有辦法實現類似的功能?
感謝
我想在運行時在GUI中顯示任意對象的公共屬性/值。c#winform在運行時檢查對象
是否有一個winform允許用戶查看調試模式下的任何對象的內容?該對象將包含許多字典>,並且能夠在運行時擴展和查看這些列表的內容將會很好。
如果不可用,有沒有辦法實現類似的功能?
感謝
有PropertyGrid
:
var form = new Form();
form.Controls.Add
(
new PropertyGrid()
{
SelectedObject = new { A = "Hi", B = new [] { 32, 40 } }
}
);
form.Show();
這是從如何調試一個作品很遠,但它可以很容易地修改,以處理您的任何特殊情況。
所有你需要做的就是創建一個帶有PropertyGrid的窗體。然後設置選定的對象。
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
使用'PropertyGrid'控件。 – Yegor