c# - 拒绝在 PropertyGrid 控件中使用拆分器

标签 c# winforms propertygrid splitter

有什么方法可以拒绝用户在 PropertyGrid 控件中使用 Splitter。我浏览了 PropertyGrid Control 的所有属性,但没有找到禁用它的方法。有什么我想念的吗?无论如何以编程方式进行。 我正在使用 C# Winforms VS2010。

谢谢

最佳答案

查看 PropertyGrid 控件的源代码:MSDN PropertyGrid

要防止水平分隔线行为,请覆盖 OnMouseDown 和 OnMouseMove 方法。要防止垂直分隔线行为,一种方法是使用 IMessageFilter 并在鼠标位置靠近分隔线位置时消耗鼠标事件。

public class MyForm3 : Form, IMessageFilter {

    PropertyGrid pg = new MyPropertyGrid { Dock = DockStyle.Fill };
    Control gridView = null;
    MethodInfo miSplittlerInside = null;

    public MyForm3() {
        Controls.Add(pg);
        pg.SelectedObject = new Button { Text = "Bob" };

        var f = typeof(PropertyGrid).GetField("gridView", BindingFlags.Instance | BindingFlags.NonPublic);
        gridView = (Control) f.GetValue(pg);
        miSplittlerInside = gridView.GetType().GetMethod("SplitterInside", BindingFlags.Instance | BindingFlags.NonPublic);

        Application.AddMessageFilter(this);
    }

    private const int WM_MOUSEMOVE = 0x200;
    private const int WM_LBUTTONDOWN = 0x201;
    private const int WM_LBUTTONDBLCLK = 0x203;

    public bool PreFilterMessage(ref Message m) {
        if (m.HWnd == gridView.Handle) {
            if (m.Msg == WM_MOUSEMOVE || m.Msg == WM_LBUTTONDOWN || m.Msg == WM_LBUTTONDBLCLK) {
                Point pt = new Point(m.LParam.ToInt32());
                bool inside = (bool) miSplittlerInside.Invoke(gridView, new Object[] { pt.X, pt.Y });
                if (inside) {
                    return true;
                }
            }
        }
        return false;
    }

    class MyPropertyGrid : PropertyGrid {
        protected override void OnMouseMove(MouseEventArgs me) {
            //base.OnMouseMove(me);
            // do nothing, prevent user from moving the split bar
        }

        protected override void OnMouseDown(MouseEventArgs me) {
            //base.OnMouseDown(me);
        }
    }
}

注意:不调用基本方法会产生副作用,即不会触发这些事件的任何监听器。

说明:代码阻止了紫色拆分器。您的问题是指橙色还是紫色?

enter image description here

关于c# - 拒绝在 PropertyGrid 控件中使用拆分器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32745445/

相关文章:

c# - Hangfire 服务器正在尝试处理来自其他队列的作业

c# - asp.net mvc如何汇总数据库的一列并通过标签显示?

c# - 如何将变量作为 CommandParameter 传递

c# - 如何在 Windows 窗体 C# 中打印可滚动面板

c# - 如何使用 Tab 在 winform 属性网格的属性之间移动

c# - 从 PropertyGrid 集合属性中删除 "..."按钮

c# - 使用 linq 聚合文本文件内容,以便将它们分组

c# - 如何在显示 ContextMenuStrip 时接收鼠标移动事件?

c# - 如果调用 MessageBox.Show(),定时器就可以工作

c# - PropertyGrid 中 boolean 属性的自定义编辑器 (C#)