2012-03-02 23 views
11

Tôi muốn thay đổi màu nền của hàng DGV dựa trên điều kiện cụ thể khi tải ngay cả trong Biểu mẫu Windows. Nhưng tôi không thể thấy bất kỳ sự thay đổi màu nào đối với bất kỳ hàng nào của DGV. Bất cứ ai có thể cho tôi biết làm thế nào tôi có thể giải quyết vấn đề này?Màu nền của hàng DataGridView không thay đổi

private void frmSecondaryPumps_Load(object sender, EventArgs e) 
{ 
      try 
      { 
       DataTable dt = DeviceData.BindData("SECONDARY_PUMPS".ToUpper()); 
       dataGridView1.DataSource = dt; 

       foreach (DataGridViewRow row in dataGridView1.Rows) 
       { 
        foreach (DataGridViewColumn column in dataGridView1.Columns) 
        { 
         if (row.Cells[column.Name] != null) 
         { 
          if (row.Cells[column.Name].Value.ToString() == "ON") 
           row.DefaultCellStyle.BackColor = System.Drawing.Color.Green; 

          if (row.Cells[column.Name].Value.ToString() == "OFF") 
           row.DefaultCellStyle.BackColor = System.Drawing.Color.Red; 
         } 
        } 
       } 

       dataGridView1.Refresh(); 
      } 
      catch (Exception err) 
      { 
       MessageBox.Show(err.Message); 
      } 
     } 
+1

tại sao không thiết' BackColor' thay vì 'ForeColor' – V4Vendetta

+0

tôi đã cố gắng này là tốt, nhưng tôi có thể' t thấy bất kỳ thay đổi nào về màu hàng trong bất kỳ hàng nào của DGV – Stardust

Trả lời

11

Tôi nghĩ rằng vị trí tốt nhất là để thiết lập các BackColor trong trường hợp CellFormatting của DataGridView, một cái gì đó trên những dòng này.

private void grid1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    DataGridViewRow row = grid1.Rows[e.RowIndex];// get you required index 
    // check the cell value under your specific column and then you can toggle your colors 
    row.DefaultCellStyle.BackColor = Color.Green; 
} 
+0

Cảm ơn! Nó đã hoạt động! – Stardust

+4

Như đã nói dưới đây bởi King_Rob, Cellformatting sẽ liên tục kích hoạt sự kiện ngay cả khi di chuyển. Sử dụng nó một cách thận trọng. – henry

+0

Sự kiện đó được kích hoạt nhiều lần. –

9

Một trong những vấn đề với việc sử dụng một trong hai cellformatting, databindingcomplete hoặc thậm chí paint sự kiện là họ bị sa thải nhiều lần. Từ những gì tôi đã thu thập được, có sự cố với điều khiển datagridview ở chỗ bạn không thể thay đổi màu của bất kỳ ô nào cho đến SAU KHI biểu mẫu được hiển thị. Do đó, các phương thức chạy hoặc các sự kiện kích hoạt trước Shown() được gọi sẽ không thay đổi màu sắc. Các sự kiện được định vị là giải pháp cho vấn đề thường hoạt động, nhưng vì chúng được gọi nhiều lần, có thể không phải là câu trả lời hiệu quả nhất.

Có lẽ giải pháp đơn giản nhất cho vấn đề là đặt mã của bạn để điền/tô màu lưới của bạn theo phương thức Shown() của biểu mẫu thay vì hàm tạo. Dưới đây là một liên kết đến một bài viết trong các diễn đàn msdn mà tipped tôi ra để giải pháp, nó được đánh dấu là câu trả lời về 3/4 của con đường xuống trang.

MSDN forums post with the Solution

+0

Đây phải là câu trả lời đúng. Và chỉ để thêm chi tiết triển khai: Sử dụng sự kiện Tải để đặt cờ và sau đó là sự kiện Hiển thị để đặt màu nền. – Daltons

+0

Đây là câu trả lời đúng. Cải thiện hiệu suất vì nó không kích hoạt nhiều lần giống như trong khi sử dụng định dạng di động và các trình xử lý khác – Anand

0

Xin lỗi vì đã trả lời muộn nhưng tôi chỉ gặp phải cùng một vấn đề ngay bây giờ.

Tôi có một số giải pháp chung cho những thứ không hoạt động đúng trong các nhà xây dựng - sử dụng một bộ đếm thời gian

Set nó trong một thời gian ngắn như 100 ms. Sau đó, trong constructor bạn sẽ có

timer1.Enabled=true 

và trong trường hợp timer_Tick:

timer1.Enabled=false 

and all the code that doesn't work in constructor goes here... 

Nó làm việc cho tôi mỗi lần.

3

King_Rob là chính xác. Tôi đã có cùng một vấn đề vì vậy tôi sẽ chỉ đăng bài thực hiện của tôi kể từ khi các đề xuất khác ở đây là xa tối ưu.

Thêm sự kiện xử lý (trong thiết kế hoặc xây dựng):

this.Load += UserControl_Load; // or form or any control that is parent of the datagridview 
dataGridView1.VisibleChanged += DataGridView1_VisibleChanged; 

Trong phương pháp hander kiện nạp thêm một lá cờ

private bool _firstLoaded; 
private void UserControl_Load(object sender, EventArgs e) 
{ 
    _firstLoaded = true; 
} 

Và cuối cùng trong phương pháp xử lý sự kiện có thể nhìn thấy:

private void DataGridView1_VisibleChanged(object sender, EventArgs e) 
{ 
    if (_firstLoaded && dataGridView1.Visible) 
    { 
     _firstLoaded = false; 
     // your code 
    } 
} 
+0

Câu trả lời ít nhất! Cảm ơn bạn! –

-1

Mã này nhanh, dễ dàng và không tiêu thụ bộ nhớ!

Sử dụng mã này, ví dụ, bên trong sự kiện CellEndEdit

`try{ 
//your code 
} 
catch(Exception){ 
//your exception 
} 
finally{ 
yourDataGridView.Visible = false; 
yourDataGridView.Visible = true; 
} 

'

+0

cách thậm chí giúp người dùng? – gmetax

+0

Có thể nó giống với các Sản phẩm khác của Microsoft và tắt máy và khởi động lại ('Hiển thị = false; Hiển thị = true') có thực sự giúp ích không? – derM

+0

Nếu nó hoạt động (và nó hoạt động cho tôi) nó có nghĩa là nó giúp. Bạn có đồng ý với tôi không? – SCG