2010-12-15 40 views
11

Tôi có một DataGridView nơi nền của mỗi hàng khác nhau tùy thuộc vào mục bị ràng buộc dữ liệu. Mặc dù, khi tôi chọn một hàng, tôi không thể nhìn thấy màu nền ban đầu của nó nữa.Dòng DataGridView: Lựa chọn bán trong suốt hoặc đường viền hàng trên lựa chọn

Để giải quyết điều này, tôi đã nghĩ đến hai giải pháp:

tôi có thể làm cho các lựa chọn bán trong suốt, làm cho nó có thể nhìn thấy nếu hai hàng được lựa chọn có màu nền khác nhau.

Hoặc; Tôi có thể xóa hoàn toàn các màu lựa chọn và vẽ đường viền quanh các hàng đã chọn.

Tùy chọn nào dễ hơn và làm cách nào để tôi thực hiện việc này?

Đó là ứng dụng WinForm.

Edit: tôi đã kết thúc sử dụng một số mã của bạn, trôi dạt

private void dgv_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) 
    { 
     if (dgv.Rows[e.RowIndex].Selected) 
     { 
      var row = dgv.Rows[e.RowIndex]; 
      var bgColor = row.DefaultCellStyle.BackColor; 
      row.DefaultCellStyle.SelectionBackColor = Color.FromArgb(bgColor.R * 5/6, bgColor.G * 5/6, bgColor.B * 5/6); 
     } 
    } 

này cho ấn tượng của một màu sắc lựa chọn bán trong suốt. Cảm ơn bạn đã giúp đỡ!

Trả lời

7

Nếu bạn muốn vẽ đường viền quanh các hàng đã chọn, bạn có thể sử dụng DataGridView.RowPostPaintEvent và để 'xóa' màu lựa chọn, bạn có thể sử dụng các thuộc tính DataGridViewCellStyle.SelectionBackColorDataGridViewCellStyle.SelectionForeColor.

Ví dụ, nếu tôi đặt phong cách di động hàng như thế này

row.DefaultCellStyle.BackColor = Color.LightBlue; 
row.DefaultCellStyle.SelectionBackColor = Color.LightBlue; 
row.DefaultCellStyle.SelectionForeColor = dataGridView1.ForeColor; 

tôi có thể thêm mã này vào các RowPostPaintEvent

private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) 
{ 
    if (dataGridView1.Rows[e.RowIndex].Selected) 
    { 
     using (Pen pen = new Pen(Color.Red)) 
     { 
      int penWidth = 2; 

      pen.Width = penWidth; 

      int x = e.RowBounds.Left + (penWidth/2); 
      int y = e.RowBounds.Top + (penWidth/2); 
      int width = e.RowBounds.Width - penWidth; 
      int height = e.RowBounds.Height - penWidth; 

      e.Graphics.DrawRectangle(pen, x, y, width, height); 
     } 
    } 
} 

và một hàng được chọn sẽ hiển thị như thế này:

row with border

+0

Tôi đã chụp cảnh này và điều đó vẫn ổn. Sau đó nó xuất hiện một vấn đề mới - màu lựa chọn trong suốt trông thực sự xấu xí (văn bản được dựa trên văn bản cũ và các công cụ, khó giải thích;)) sau khi sắp xếp, vì vậy tôi sẽ tìm một giải pháp khác. –

+0

Tôi đã sử dụng mã của bạn để tạo màu lựa chọn nửa công khai thay thế - xem chỉnh sửa. Cảm ơn bạn đã giúp đỡ! –

Các vấn đề liên quan