4
A
回答
2
您在項目之間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
,並檢查我們是否爲e.DataRepeaterItem
創建了DataRepeaterItemHelper
。它有助於使用與項目背面顏色相同的顏色繪製分隔符。同樣在將數據加載到DataRepeater
之後,我們應該爲DrawItem
事件不爲他們觸發的第一項創建DataRepeaterItemHelper
。爲了跟蹤我們創建了一個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);
}
這裏是結果:
注:
- 應用解決方案時,請不要忘記將
Form1_Load
事件附加到Load
事件的形式。您不需要將dataRepeater1_DrawItem
附加到DrawItem
事件。已使用代碼附加在Form1_Load
中。 - 您可以將邏輯封裝在派生的
DataRepeater
控件中。
相關問題
- 1. 的WinForms工具提示中的WinForms DataGridViewImageColumn
- 2. MVP中的WinForms
- 3. 中的WinForms
- 4. winforms中的IDataErrorInfo
- 5. 中的WinForms
- 6. TargetInvocationException中的WinForms
- 7. 中的WinForms
- 8. WinForms中的PetaPoco
- 9. WinForms中的UDPclient?
- 10. WinForms中的按鈕
- 11. C#WinForms中的ToggleButton
- 12. winforms中的monodroid庫
- 13. 處理中的WinForms
- 14. 拖放 - 中的WinForms
- 15. WinForms中的WPF UI
- 16. Winforms中的金條
- 17. WinForms中的C#中的OpenGL
- 18. 提示Winforms中
- 19. Winforms中的無效擴展
- 20. Winforms中的固定表C#
- 21. winforms中的Designtime範圍
- 22. WinForms中的AJAX功能
- 23. WinForms中的ObserverableCollection UI模式
- 24. 中的WinForms輸入字段
- 25. Winforms中的輸入驗證
- 26. WinForms中的WPF控件
- 27. 着色文本中的WinForms
- 28. WinForms中的簡單動畫
- 29. WinForms中的MVP導航
- 30. Winforms中的字段驗證
我發現這個答案的變體也適用於覆蓋DataRepeater的動態彩色的,不可移動的邊界。 – rileywhite