C# winform 在运行时检查对象

Fre*_*red 2 .net c# winforms

我想在运行时在 GUI 中显示任意对象的公共属性/值。

是否有一个 winform 允许用户像调试模式一样查看任何对象的内容?该对象将保存许多字典>,如果能够在运行时扩展和查看这些列表的内容,那就太好了。

如果不可用,是否有办法实现类似的目标?

谢谢

Wra*_*ath 5

您所需要做的就是创建一个带有 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
    }
}
Run Code Online (Sandbox Code Playgroud)

例如,我在网格的上下文菜单上使用它来期望其下方的数据记录:

 /// <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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

您可以做的另一个小技巧是通过使用以下代码使用“编译器指令”来确保表单仅在调试模式下构建时可用。(当然,如果您只想将其用于调试)

#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
Run Code Online (Sandbox Code Playgroud)