DevExpress SnapControl Data Explorer Dock Panel中的哪个节点触发事件

本文关键字:节点 事件 Data SnapControl Explorer Dock Panel DevExpress | 更新日期: 2023-09-27 18:21:24

我使用的是DevExpress SnapControl,我已经通过使用自定义MenuCommandHandler替换了Data Explorer Dock Panel中的"添加数据源"上下文菜单,因为DevExpress数据源向导需要很长时间才能加载,而我们使用Active Query Builder进行可视化查询构建。

我现在的问题是,当我想"删除数据源"时,我被卡住了。我可以像"添加数据源"一样覆盖事件,但我不知道在需要删除的treeview中选择了哪个DataSet

如有任何关于如何拾取节点或右键单击的节点文本的帮助,我们将不胜感激。

因为使用了MenuCommandCommandID等,所以我有点力不从心。我花了一段时间才能够覆盖被触发的事件本身,但几个小时后最终发现了这一点。

这是我的实现

public DevExReportSnapDesignerForm()
{
    InitializeComponent();
    MenuCommandHandler menuCommandHandler = new CustomMenuCommandHandler(report);
    menuCommandHandler.RegisterMenuCommands();
    report.RemoveService(typeof(MenuCommandHandler));
    report.AddService(typeof(MenuCommandHandler), menuCommandHandler);
}
public class CustomMenuCommandHandler : MenuCommandHandler
{
    SnapControl snapControl;
    public CustomMenuCommandHandler(SnapControl snap)
        : base(snap)
    {
        snapControl = snap;
    }

    public override void UpdateCommandStatus()
    {
        base.UpdateCommandStatus();
        DevExpress.XtraReports.Design.Commands.CommandSetItem AddDS = null;
        DevExpress.XtraReports.Design.Commands.CommandSetItem RemoveDS = null;
        foreach (DevExpress.XtraReports.Design.Commands.CommandSetItem item in commands)
        {
            if (item.CommandID == DataExplorerCommands.AddDataSource)
                AddDS = item;
            if (item.CommandID == DataExplorerCommands.RemoveDataSource)
                RemoveDS = item;
        }
        if (AddDS != null)
            CreateCommandEventHandler(new EventHandler(AddDS_OnClick), AddDS);
        if (RemoveDS != null)
            CreateCommandEventHandler(new EventHandler(RemoveDS_OnClick), RemoveDS);
    }
    public void CreateCommandEventHandler(EventHandler handler, MenuCommand item)
    {
        var mcs = snapControl.GetService(typeof(IMenuCommandService)) as IMenuCommandService;
        var menuCommandID = new CommandID(item.CommandID.Guid, item.CommandID.ID);
        var MenuItem = new MenuCommand(handler, menuCommandID);
        mcs.RemoveCommand(item);
        mcs.AddCommand(MenuItem);
    }
    public void AddDS_OnClick(object sender, EventArgs e)
    {
        //Execute Add Code
    }
    public void RemoveDS_OnClick(object sender, EventArgs e)
    {
        //Remove Code
    }
}

编辑

我现在通过在表单构造函数中添加以下代码,为SnapFieldListTreeView的MouseDown事件分配了一个事件处理程序:

private SnapFieldListTreeView tv;
private TreeListNode dsTreeNode;
public DevExReportSnapDesignerForm()
{
    InitializeComponent();
    MenuCommandHandler menuCommandHandler = new CustomMenuCommandHandler(report);
    menuCommandHandler.RegisterMenuCommands();
    report.RemoveService(typeof(MenuCommandHandler));
    report.AddService(typeof(MenuCommandHandler), menuCommandHandler);
    tv = fieldListDockPanel1.Controls[0].Controls[0] as SnapFieldListTreeView;
    tv.MouseClick += Tv_MouseClick;
}
private void Tv_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
        dsTreeNode = tv.GetNodeAt(e.X, e.Y);
}

这样我就可以检索被点击的节点。如果有更好的方法,请让我知道

DevExpress SnapControl Data Explorer Dock Panel中的哪个节点触发事件

您可以在RemoveDS_OnClick事件处理程序中直接使用SnapFieldListTreeView实例。您只需要将SnapFieldListTreeView参数添加到自定义MenuCommandHandler构造函数中。当前选定的DataSet将位于SnapFieldListTreeView.FocusedNode属性中
以下是示例:

public DevExReportSnapDesignerForm()
{
    InitializeComponent();
    MenuCommandHandler menuCommandHandler = new CustomMenuCommandHandler(
        report,
        fieldListDockPanel1.Controls[0].Controls[0] as SnapFieldListTreeView);
    menuCommandHandler.RegisterMenuCommands();
    report.RemoveService(typeof(MenuCommandHandler));
    report.AddService(typeof(MenuCommandHandler), menuCommandHandler);
}
public class CustomMenuCommandHandler : MenuCommandHandler
{
    SnapControl snapControl;
    private SnapFieldListTreeView treeView;
    public CustomMenuCommandHandler(SnapControl snap, SnapFieldListTreeView tree) : base(snap)
    {
        snapControl = snap;
        treeView = tree;
    }
    //Some stuff for MenuCommandHandler.
    //...
    public void RemoveDS_OnClick(object sender, EventArgs e)
    {
        var node = treeView.FocusedNode;//<= Here comes the selected DataSet's node.
        MessageBox.Show(node.GetDisplayText(""));
        //Remove Code
    }
}