首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除Winforms中的DataRepeater控件底线

删除Winforms中的DataRepeater控件底线
EN

Stack Overflow用户
提问于 2016-09-14 13:19:41
回答 1查看 653关注 0票数 4

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-15 04:38:35

在项之间的DataRepeater控件中看到的分隔符是在DataRepeaterItem控件的非工作区上绘制的。

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

Implementation

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

代码语言:javascript
复制
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);
        }
    }
}

然后我们处理DrawItem事件的DataRepeater,并检查我们是否为e.DataRepeaterItem创建了一个DataRepeaterItemHelper。它帮助绘制与项目返回颜色相同颜色的分隔符。另外,在将数据加载到DataRepeater中之后,我们应该为DrawItem事件不为它们触发的第一项创建DataRepeaterItemHelper。为了跟踪我们为它们创建了一个DataRepeaterItemHelper的项,我们在List<DataRepeaterItem>中保存已处理的项。

代码语言:javascript
复制
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);
}

其结果是:

注:

  • 在应用解决方案时,不要忘记将Form1_Load事件附加到表单的Load事件。您不需要将dataRepeater1_DrawItem附加到DrawItem事件。它是使用代码在Form1_Load中附加的。
  • 可以将逻辑封装在派生的DataRepeater控件中。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39491561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档