gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:22:46 24 4
gpt4 key购买 nike

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

enter image description here

最佳答案

您在 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);
}
}
}

然后我们处理DrawItem DataRepeater的事件并检查我们是否没有创建 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);
}

结果如下:

enter image description here

注意:

  • 应用解决方案时,不要忘记附上 Form1_Load事件到 Load形式的事件。您不需要附加 dataRepeater1_DrawItemDrawItem事件。它已附加在 Form1_Load 中使用代码。
  • 您可以将逻辑封装在派生的 DataRepeater 中控制。

关于c# - 删除 Winforms 中的 DataRepeater Control 底线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39491561/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com