2013-07-16 81 views
5

Tôi chỉ muốn màu nền của tiêu đề hàng nhất định để thay đổi mà không làm mất các cửa sổ mặc định mát phong cách đi kèm với DataGridView:Thay đổi RowHeader trên DataGridView mà không làm mất Styles mặc định

Grid.EnableHeadersVisualStyles = false; 
for(int i=0; i<Grid.Rows.Count; i++) 
{ 
    if (/*I want to change this row */) 
    { 
     DataGridViewCellStyle rowStyle = Grid.RowHeadersDefaultCellStyle; 
     rowStyle.BackColor = Color.Wheat; 
     Grid.Rows[i].HeaderCell.Style = rowStyle; 
    } 
} 

Ngay sau khi tôi làm điều này Tôi mất hiệu ứng màu xanh lam của MouseOver trên các cột và mũi tên sắp xếp trên các cột có màu xám. Tôi đã cố gắng đặt tiêu đề cột thành defaultColHeaderStyle thành không có kết quả. Tiêu đề hàng thay đổi thành màu mong muốn, tiêu đề cột của nó bị mất kiểu Windows mượt mà. Bất kỳ giúp đỡ?

Grid.EnableHeadersVisualStyles = true

Grid.EnableHeadersVisualStyles = false

Trả lời

5

Phong cách mặc định cho các tiêu đề hàng nên đã được định nghĩa khi bạn xây dựng DataGridView của bạn. Vì vậy, tôi sẽ sử dụng:

if (/*I want to change this row */) 
{ 
    DataGridViewCellStyle rowStyle; // = Grid.RowHeadersDefaultCellStyle; 
    rowStyle = Grid.Rows[i].HeaderCell.Style; 
    rowStyle.BackColor = Color.Wheat; 
    Grid.Rows[i].HeaderCell.Style = rowStyle; 
} 

Bằng cách này bạn điền rowStyle theo kiểu được xác định trước và sau đó chỉ thay đổi phần bạn muốn thay đổi. Xem nếu điều này giải quyết vấn đề của bạn.

// EDIT Khi bạn muốn giữ các kiểu dáng khác của Windows DataGridView mặc định, bạn cũng sẽ cần phải đặt thêm các thông số khác của kiểu. Xem this post.

Hoặc thử cách này. Khi initialiazing:

 dataGridView1.CellPainting += 
    new DataGridViewCellPaintingEventHandler (dataGridView_CellPainting); 

Sau đó, tạo ra các chức năng xử lý với một cái gì đó như:

void dataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) 
    { 
     DataGridView dv = sender as DataGridView; 
     DataGridViewCellStyle rowStyle;// = dv.RowHeadersDefaultCellStyle; 

     if (e.ColumnIndex == -1) 
     { 
      e.PaintBackground(e.CellBounds, true); 
      e.Handled = true; 
      if (/*I want to change this row */) 
      { 
       rowStyle = dv.Rows[e.RowIndex].HeaderCell.Style; 
       rowStyle.BackColor = Color.Wheat; 
       dv.Rows[e.RowIndex].HeaderCell.Style = rowStyle; 
       using (Brush gridBrush = new SolidBrush(Color.Wheat)) 
       { 
        using (Brush backColorBrush = new SolidBrush(e.CellStyle.BackColor)) 
        { 
         using (Pen gridLinePen = new Pen(gridBrush)) 
         { 
          // Clear cell 
          e.Graphics.FillRectangle(backColorBrush, e.CellBounds); 
          //Bottom line drawing 
          e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right, e.CellBounds.Bottom - 1); 

          // here you force paint of content 
          e.PaintContent(e.ClipBounds); 
          e.Handled = true; 
         } 
        } 
       } 
      } 
     } 
    } 

Mã này được dựa trên this post. chỉ Sau đó bạn sẽ cần phải tạo điều kiện hơn cho sơn mouseover và nhà nước lựa chọn. Nhưng điều này sẽ làm việc cho bạn.

Hãy nhớ xóa: Grid.EnableHeadersVisualStyles = false; hoặc ép buộc: Grid.EnableHeadersVisualStyles = true;.

+0

Vấn đề là chuyển Grid.EnableHeadersVisualStyles thành false. Các tiêu đề hàng thay đổi thành màu, nhưng tiêu đề cột bằng phẳng và không giống như tiêu đề của Grid.EnableHeadersVisualStyles thành true. Ive đã thử ý tưởng của bạn cho các cột (nhận và đặt lại phong cách) nhưng nó không hoạt động ... Tôi sẽ đăng hình ảnh của những gì tôi đang nói về – Tizz

+0

Tôi hiểu rõ hơn những gì bạn đang nói về bây giờ, với những hình ảnh. Hmm. Điều này có thể không thực hiện được. – CaptainBli

+0

Bạn có thể sửa đổi một hàng riêng lẻ bằng cách sử dụng trình xử lý 'paint'. – CaptainBli

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