C# DataGridView BackColor Tidak Ditimpa

Saya memiliki DataGridView pada aplikasi formulir saya. Setelah mengambil data dari tabel di database dan menampilkannya di DataGridView, saya menerapkan warna hijau ke BackColor beberapa sel pada baris jika kondisi tertentu terpenuhi. Setelah sel tersebut diwarnai hijau, program akan melewati kondisi lain, yang akan mewarnai BackColor merah seluruh baris jika gagal memenuhi persyaratan kondisi.

Namun, sepertinya sel yang sudah diwarnai sebelumnya tidak dapat ditimpa dengan warna baru. Meskipun saya menerapkan kode berikut untuk mewarnai seluruh baris merah, ini hanya berfungsi untuk sel yang belum diwarnai sebelumnya.

for(int i=0; i<myDataGridview.Rows.Count; i++){  
    if(/*a certain condition FAILS*/){
        myDataGridView.Rows[i].DefaultCellStyle.BackColor = Color.Red;
    }
}

Saat ini, saya mewarnai sel-sel yang sudah diwarnai merah satu per satu, tetapi ini membutuhkan banyak waktu dan kode seperti:

for(int i=0; i<myDataGridview.Rows.Count; i++){  
    if(/*a certain condition FAILS*/){
        //Trying to color the whole row RED, but not working
        myDataGridView.Rows[i].DefaultCellStyle.BackColor = Color.Red;
        //Manually color the cells, which are pre-colored to green, RED
        myDataGridView.Rows[i].Cells[6].Style.BackColor = Color.Red;
        myDataGridView.Rows[i].Cells[7].Style.BackColor = Color.Red;
        ....
        myDataGridView.Rows[i].Cells[13].Style.BackColor = Color.Red;
        myDataGridView.Rows[i].Cells[16].Style.BackColor = Color.Red;
    }
}

Saya bertanya-tanya apakah ada cara yang lebih baik untuk mengganti backColor. Dapatkah seseorang tolong bantu?

Berikut adalah contoh (tiruan) DataGridView.

Sel Hijau tidak ditimpa oleh Baris Merah

Mereka yang gagal dalam kondisi pertama secara otomatis membuat seluruh barisnya menjadi merah, dan itu berhasil. Namun, jika mereka melewati kondisi pertama dan membuat sel "Pass1" berwarna hijau, lalu gagal pada kondisi kedua, seperti yang Anda lihat, sel tersebut tetap hijau. Saya ingin mewarnai seluruh baris menjadi merah, bahkan menimpa sel yang sebelumnya diwarnai menjadi hijau menjadi merah.


person Mika Jones    schedule 21.09.2017    source sumber
comment
a) jelaskan 'warna awal'! b) lihat di sini untuk contoh mewarnai sel pada event CellPainting. Jika Anda mengkodekan seluruh kondisi, itu sudah cukup.   -  person TaW    schedule 21.09.2017
comment
Jika BackColor baru telah diterapkan ke sel (artinya pra-warna), BackColor sel tersebut tidak dapat diubah ke warna lain, bahkan jika saya mencoba mewarnai seluruh baris termasuk sel itu dengan myDataGridView.Rows[i].DefaultCellStyle.BackColor   -  person Mika Jones    schedule 21.09.2017
comment
Itu akan menjadi perbedaan antara nilai default dan nilai yang diganti. Gunakan sel.BackColor untuk mengganti nilai default atau perubahan sebelumnya! Juga: Cobalah untuk memusatkan semua pewarnaan dll di CellPainting..   -  person TaW    schedule 21.09.2017
comment
Pada gambar yang saya lampirkan di postingan saya, baris dengan ID:2, 4 dan 5 tidak dapat sepenuhnya diwarnai menjadi Merah, dan sel Passed1-nya tetap hijau.   -  person Mika Jones    schedule 21.09.2017
comment
Nah kalau kamu ganti warna selnya saja menjadi hijau, sel itu saja yang diubah, bukan seluruh barisnya. Silakan baca Cara Bertanya dan ikuti tur   -  person Ňɏssa Pøngjǣrdenlarp    schedule 21.09.2017
comment
@Plutonix Saya tahu itu. Saya hanya bertanya-tanya mengapa menerapkan perubahan warna ke seluruh baris tidak mempengaruhi sel yang sudah memiliki backColor. Saya kira bahasa Inggris saya yang buruk tidak masuk akal...   -  person Mika Jones    schedule 21.09.2017
comment
Silakan baca Cara Bertanya dan ikuti tur. Kami tidak memiliki banyak konteks ketika Anda melakukan apa....yang penting dalam pemrograman berbasis peristiwa. Saya tidak akan mengulang semua baris untuk memulai karena tidak efisien   -  person Ňɏssa Pøngjǣrdenlarp    schedule 21.09.2017


Jawaban (2)


Warna latar belakang sel memiliki urutan prioritas saat sel digambar. Dimulai dari atas, daftar akan mengalir ke bawah hingga warnanya disetel*:

  1. Cell.Style.BackColor
  2. Row.DefaultCellStyle.BackColor
  3. DataGridView.AlternatingRowsDefaultCellStyle.BackColor
  4. DataGridView.RowsDefaultCellStyle.BackColor
  5. Column.DefaultCellStyle.BackColor
  6. DataGridView.DefaultCellStyle.BackColor

* Daftar ini tidak luas dan mungkin tidak mencakup semua properti yang mungkin dapat diakses BackColor.


Kemungkinan Anda melakukan sesuatu yang mirip dengan menyetel Cell.Style.BackColor untuk sel di kolom Passed1, lalu logika kode yang Anda posting. Yang memberikan hasil seperti yang Anda lihat karena Green memiliki prioritas lebih tinggi daripada Red yang ditetapkan:

Sel Hijau tidak ditimpa oleh Baris Merah

Dengan asumsi kondisi Anda untuk dua kolom Passed adalah biner (Yes atau No), Anda dapat memperbaikinya dengan "menurunkan" prioritas latar belakang Green dengan menyetel Column.DefaultCellStyle.BackColor:

private void DataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    this.dataGridView1.Columns["Passed1"].DefaultCellStyle.BackColor = Color.Green;
    this.dataGridView1.Columns["Passed2"].DefaultCellStyle.BackColor = Color.Green;

    foreach (DataGridViewRow row in this.dataGridView1.Rows)
    {
        if (row.Cells["Passed1"].Value.ToString() == "No" || row.Cells["Passed2"].Value.ToString() == "No")
        {
            row.DefaultCellStyle.BackColor = Color.Red;
        }
    }
}

Yang mengakibatkan:

Sel Hijau digantikan oleh Baris Merah

person OhBeWise    schedule 21.09.2017
comment
Terima kasih! Inilah jawaban yang saya inginkan. Saya tidak tahu bahwa ada urutan yang diutamakan. Itulah yang menyebabkan masalah saya. Saya senang Anda memahami pertanyaan saya dengan benar. - person Mika Jones; 22.09.2017
comment
Sejujurnya, saya belum pernah menemukan daftar pesanan ini di mana pun - bahkan dalam pencarian saya di dokumentasi MSDN. Saya hanya tahu dari trial and error. - person OhBeWise; 22.09.2017
comment
Aku hanya ingin mengucapkan terima kasih sekali lagi. Saya sedang mengerjakan proyek baru saya dan saya mempunyai masalah yang sangat mirip dengan ini, dan saya kembali ke urutan prioritas ini, dan masalah tersebut segera diperbaiki. Terima kasih terima kasih terima kasih. - person Mika Jones; 18.10.2017
comment
Itu luar biasa! Senang untuk membantu. :) - person OhBeWise; 18.10.2017
comment
@OhBeWise memiliki masalah serupa, menurut saya pribadi aneh jika yang terbaru tidak menimpanya. - person A.bakker; 10.01.2020

Ada masalah dengan kontrol datagridview di mana Anda tidak dapat mengubah warna sel mana pun hingga SETELAH formulir ditampilkan dengan menggunakan properti DefaultCellStyle. Jadi metode yang dijalankan, atau peristiwa yang diaktifkan sebelum Shown() dipanggil tidak akan mengubah warnanya. Mungkin itulah masalahnya. Mungkin Anda harus membuat metode pengecatan dan memanggilnya sebelum Shown().

person Dimitris Baltas    schedule 21.09.2017