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
。
如有任何关于如何拾取节点或右键单击的节点文本的帮助,我们将不胜感激。
因为使用了MenuCommand
、CommandID
等,所以我有点力不从心。我花了一段时间才能够覆盖被触发的事件本身,但几个小时后最终发现了这一点。
这是我的实现
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);
}
这样我就可以检索被点击的节点。如果有更好的方法,请让我知道
您可以在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
}
}