2016-09-14 53 views

回答

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

這裏是結果:

enter image description here

注:

  • 應用解決方案時,請不要忘記將Form1_Load事件附加到Load事件的形式。您不需要將dataRepeater1_DrawItem附加到DrawItem事件。已使用代碼附加在Form1_Load中。
  • 您可以將邏輯封裝在派生的DataRepeater控件中。
+0

我發現這個答案的變體也適用於覆蓋DataRepeater的動態彩色的,不可移動的邊界。 – rileywhite