如何删除DataRepeater控件中数据控件项的底部边框线:

最佳答案

您在 DataRepeater 控件中看到的项之间的分隔符,是在 DataRepeaterItem 控件的非客户区上绘制的。

您可以找到那些 DataRepeaterItem 并处理那些 WM_NCPAINT 消息,并绘制一条与项目 BackColor 或任何其他您想要的颜色相同的线,从 (0, Height-1)(Width-1, Height-1)

实现

为此,我们创建了一个派生自 NativeWindow 的类,如果我们将其他窗口的句柄分配给它,它使我们能够处理另一个窗口的消息:

using Microsoft.VisualBasic.PowerPacks;
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class DataRepeaterItemHelper : NativeWindow
{
    private DataRepeaterItem item;
    private const int WM_NCPAINT = 0x85;
    [DllImport("user32.dll")]
    static extern IntPtr GetWindowDC(IntPtr hWnd);
    [DllImport("user32.dll")]
    static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
    public DataRepeaterItemHelper(DataRepeaterItem repeaterItem)
    {
        item = repeaterItem;
        this.AssignHandle(item.Handle);
    }
    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        if (m.Msg == WM_NCPAINT)
        {
            var hdc = GetWindowDC(m.HWnd);
            using (var g = Graphics.FromHdcInternal(hdc))
            using (var p = new Pen(item.BackColor, 1))
                g.DrawLine(p, 0, item.Height - 1, item.Width - 1, item.Height - 1);
            ReleaseDC(m.HWnd, hdc);
        }
    }
}

然后我们处理 DrawItemDataRepeater 事件并检查我们是否没有为 DataRepeaterItemHelper 创建一个 e.DataRepeaterItem 我们创建一个。它有助于使用与项目背景颜色相同的颜色绘制分隔符。同样在将数据加载到 DataRepeater 之后,我们应该为 DataRepeaterItemHelper 事件不会为它们触发的第一项创建 DrawItem。为了跟踪我们为它们创建了 DataRepeaterItemHelper 的项目,我们将处理的项目保存在 List<DataRepeaterItem> 中:
new List<DataRepeaterItem> items = new List<DataRepeaterItem>();
void HandleItem(DataRepeaterItem item)
{
    if (items.Contains(item))
        return;
    var handler = new DataRepeaterItemHelper(item);
    items.Add(item);
}
private void Form1_Load(object sender, EventArgs e)
{
    //Load data and put data in dataRepeater1.DataSource
    var db = new TestDBEntities();
    this.dataRepeater1.DataSource = db.Category.ToList();
    this.dataRepeater1.Controls.OfType<DataRepeaterItem>().ToList()
        .ForEach(item => HandleItem(item));
    this.dataRepeater1.DrawItem += dataRepeater1_DrawItem;
}
void dataRepeater1_DrawItem(object sender, DataRepeaterItemEventArgs e)
{
    HandleItem(e.DataRepeaterItem);
}

结果如下:

c# - 删除 Winforms 中的 DataRepeater Control 底线-LMLPHP

注意:
  • 应用解决方案时,不要忘记将 Form1_Load 事件附加到表单的 Load 事件。您不需要将 dataRepeater1_DrawItem 附加到 DrawItem 事件。它已使用代码附加在 Form1_Load 中。
  • 您可以将逻辑封装在派生的 DataRepeater 控件中。
  • 10-08 10:56