DevExpress WinForms:在ViewCaption旁添加新增行按钮
解决WinForm三级数据详情视图标题旁添加"+"按钮的方案
针对你使用嵌入式网格展示Issue→Invoice→Invoice Items三级数据,需要在详情ViewCaption旁添加新增按钮的需求,以下是几个可行的解决方向:
1. 自定义绘制ViewCaption并捕获点击事件
利用GridView的CustomDrawViewCaption事件手动绘制"+"按钮区域,再通过鼠标事件判断点击位置触发新增逻辑:
// 自定义绘制标题旁的+按钮 private void gridViewInvoice_CustomDrawViewCaption(object sender, DevExpress.XtraGrid.Views.Grid.CustomDrawViewCaptionEventArgs e) { GridView view = sender as GridView; // 计算按钮位置(标题文本右侧) Rectangle btnRect = new Rectangle(e.Bounds.Right - 30, e.Bounds.Top, 25, e.Bounds.Height); // 绘制按钮背景和+符号 e.Graphics.FillRectangle(Brushes.LightGray, btnRect); e.Graphics.DrawRectangle(Pens.Black, btnRect); e.Graphics.DrawString("+", new Font("Arial", 12), Brushes.Black, btnRect, new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center }); // 存储按钮区域供后续点击判断 view.Tag = btnRect; } // 捕获鼠标点击事件判断是否点击了按钮 private void gridViewInvoice_MouseDown(object sender, MouseEventArgs e) { GridView view = sender as GridView; Rectangle btnRect = view.Tag as Rectangle; if (btnRect != null && btnRect.Contains(e.Location)) { // 执行新增Invoice的逻辑 AddNewInvoice(view); } }
2. 直接在ViewCaption容器中添加Button控件
通过查找GridView标题对应的Label控件的父容器,直接插入Button:
private void gridViewInvoice_VisibleChanged(object sender, EventArgs e) { GridView view = sender as GridView; // 查找ViewCaption的Label控件 Label captionLabel = view.Controls.OfType<Label>().FirstOrDefault(l => l.Name == "viewCaption"); if (captionLabel != null && captionLabel.Parent.Controls.OfType<Button>().FirstOrDefault(b => b.Name == "btnAdd") == null) { Button btnAdd = new Button(); btnAdd.Name = "btnAdd"; btnAdd.Text = "+"; btnAdd.Size = new Size(25, captionLabel.Height); btnAdd.Location = new Point(captionLabel.Right + 5, captionLabel.Top); btnAdd.Click += (s, args) => { AddNewInvoice(view); }; captionLabel.Parent.Controls.Add(btnAdd); } }
注意:需确保在视图可见时执行此逻辑,避免控件未初始化的问题。
3. 使用DetailDescriptor的自定义Header模板(适用于DevExpress明细描述器)
如果你的三级数据是通过GridViewDetailDescriptor配置的,可以直接自定义明细视图的HeaderTemplate,在模板中加入Button:
// 代码方式创建自定义Header模板 GridViewDetailDescriptor invoiceDetailDescriptor = new GridViewDetailDescriptor(); // 创建模板控件 LayoutControl layout = new LayoutControl(); LayoutControlItem captionItem = new LayoutControlItem(layout, null); captionItem.Text = "Invoices"; // 添加新增按钮 Button btnAdd = new Button(); btnAdd.Text = "+"; btnAdd.Click += (s, args) => { AddNewInvoice(invoiceDetailDescriptor.InnerView as GridView); }; LayoutControlItem btnItem = new LayoutControlItem(layout, btnAdd); layout.AddItem(captionItem); layout.AddItem(btnItem); // 绑定模板到DetailDescriptor invoiceDetailDescriptor.HeaderTemplate = new ControlTemplate(() => layout); // 将DetailDescriptor绑定到顶级Issue视图 gridViewIssue.DetailDescriptor = invoiceDetailDescriptor;
这种方式更贴合DevExpress的组件设计,无需手动定位控件。
内容的提问来源于stack exchange,提问作者derYak
相关产品推荐
相关产品推荐

