DevExpress RibbonForm按钮点击无法打开对应View至Frame问题求助
问题排查:DevExpress RibbonForm按钮点击事件无响应
通过模板创建了DevExpress MainController(RibbonForm),包含Employees和Customers两个按钮,期望点击Employees按钮时在Frame中打开EmployeesView,点击Customers按钮时打开CustomersView,但按钮点击事件无法正常运行,以下是相关代码:
MainController.cs
using DevExpress.XtraBars; using DevExpress.XtraBars.Docking2010.Views; using DevExpress.XtraBars.Navigation; using DevExpress.XtraEditors; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace aza.Forms { public partial class MainController : DevExpress.XtraBars.Ribbon.RibbonForm { XtraUserControl employeesUserControl; XtraUserControl customersUserControl; public MainController() { InitializeComponent(); employeesUserControl = CreateUserControl("Employees"); customersUserControl = CreateUserControl("Customers"); accordionControl.SelectedElement = employeesAccordionControlElement; } XtraUserControl CreateUserControl(string text) { XtraUserControl result = new XtraUserControl(); result.Name = text.ToLower() + "UserControl"; result.Text = text; LabelControl label = new LabelControl(); label.Parent = result; label.Appearance.Font = new Font("Tahoma", 25.25F); label.Appearance.ForeColor = Color.Gray; label.Dock = System.Windows.Forms.DockStyle.Fill; label.AutoSizeMode = LabelAutoSizeMode.None; label.Appearance.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; label.Appearance.TextOptions.VAlignment = DevExpress.Utils.VertAlignment.Center; label.Text = text; return result; } void accordionControl_SelectedElementChanged(object sender, SelectedElementChangedEventArgs e) { if (e.Element == null) return; XtraUserControl userControl = e.Element.Text == "Employees" ? employeesUserControl : customersUserControl; tabbedView.AddDocument(userControl); tabbedView.ActivateDocument(userControl); } void barButtonNavigation_ItemClick(object sender, ItemClickEventArgs e) { int barItemIndex = barSubItemNavigation.ItemLinks.IndexOf(e.Link); accordionControl.SelectedElement = mainAccordionGroup.Elements[barItemIndex]; } void tabbedView_DocumentClosed(object sender, DocumentEventArgs e) { RecreateUserControls(e); SetAccordionSelectedElement(e); } void SetAccordionSelectedElement(DocumentEventArgs e) { if (tabbedView.Documents.Count != 0) { if (e.Document.Caption == "Employees") accordionControl.SelectedElement = customersAccordionControlElement; else accordionControl.SelectedElement = employeesAccordionControlElement; } else { accordionControl.SelectedElement = null; } } void RecreateUserControls(DocumentEventArgs e) { if (e.Document.Caption == "Employees") employeesUserControl = CreateUserControl("Employees"); else customersUserControl = CreateUserControl("Customers"); } private void employesButton_ItemClick(object sender, ItemClickEventArgs e) { } private void customersButton_ItemClick(object sender, ItemClickEventArgs e) { } } }
EmployeesView.cs
using DevExpress.XtraEditors; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace aza.Forms { public partial class EmployeesView: DevExpress.XtraEditors.XtraForm { public EmployeesView() { InitializeComponent(); } } }
CustomersView.cs
using DevExpress.XtraEditors; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace aza.Forms { public partial class CustomersView: DevExpress.XtraEditors.XtraForm { public CustomersView() { InitializeComponent(); } } }
问题原因及修复方案
事件方法为空+拼写错误
- 两个按钮的点击事件方法内部无任何逻辑,且
employesButton_ItemClick存在拼写错误(应为employeesButton_ItemClick),这会导致设计器无法正确绑定事件,即便绑定也不会执行任何操作。
- 两个按钮的点击事件方法内部无任何逻辑,且
逻辑与需求不匹配
当前代码中创建的是XtraUserControl用于TabbedView,但需求是打开XtraForm类型的EmployeesView和CustomersView,逻辑完全不符。
修复步骤:
1. 修正事件方法并添加逻辑
如果要在TabbedView中嵌入Form,替换原空方法为以下代码:
// 修正拼写后的Employees按钮点击事件 private void employeesButton_ItemClick(object sender, ItemClickEventArgs e) { // 避免重复打开相同文档 var existingDoc = tabbedView.Documents.FirstOrDefault(d => d.Caption == "Employees"); if (existingDoc != null) { tabbedView.ActivateDocument(existingDoc); return; } // 创建视图实例并添加到TabbedView EmployeesView empView = new EmployeesView(); empView.Text = "Employees"; var doc = tabbedView.AddDocument(empView); tabbedView.ActivateDocument(doc); } // Customers按钮点击事件 private void customersButton_ItemClick(object sender, ItemClickEventArgs e) { var existingDoc = tabbedView.Documents.FirstOrDefault(d => d.Caption == "Customers"); if (existingDoc != null) { tabbedView.ActivateDocument(existingDoc); return; } CustomersView custView = new CustomersView(); custView.Text = "Customers"; var doc = tabbedView.AddDocument(custView); tabbedView.ActivateDocument(doc); }
如果需求是独立打开Form,直接使用:
private void employeesButton_ItemClick(object sender, ItemClickEventArgs e) { new EmployeesView().Show(); } private void customersButton_ItemClick(object sender, ItemClickEventArgs e) { new CustomersView().Show(); }
2. 确认事件绑定正确
打开MainController设计视图,选中对应按钮,在属性窗口的事件列表中,确认ItemClick事件绑定的是修正后的方法(注意拼写)。
3. 清理冗余代码
删除原代码中与XtraUserControl相关的变量和方法(employeesUserControl、customersUserControl、CreateUserControl等),避免逻辑混淆。
内容的提问来源于stack exchange,提问作者Noucoder
相关产品推荐
相关产品推荐

