C # DataGridView BackColor ไม่ได้ถูกเขียนทับ

ฉันมี DataGridView ในใบสมัครแบบฟอร์มของฉัน หลังจากดึงข้อมูลจากตารางในฐานข้อมูลและแสดงใน DataGridView ฉันจะใช้สี สีเขียว กับ BackColor ของแถวบางเซลล์หากตรงตามเงื่อนไขที่กำหนด หลังจากที่เซลล์เหล่านั้นมีสีเป็น สีเขียว โปรแกรมจะทำให้เซลล์เหล่านั้นผ่านเงื่อนไขอื่น ซึ่งจะให้สี BackColor สีแดง ของทั้งแถว หากไม่เป็นไปตามเงื่อนไข เงื่อนไข.

อย่างไรก็ตาม ดูเหมือนว่าเซลล์ที่ใส่สีไว้ล่วงหน้าแล้วจะไม่สามารถเขียนทับด้วยสีใหม่ได้ แม้ว่าฉันจะใช้โค้ดต่อไปนี้เพื่อระบายสีทั้งแถว สีแดง แต่จะใช้ได้เฉพาะกับเซลล์ที่ไม่ได้มีการกำหนดสีไว้ล่วงหน้าเท่านั้น

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

ตอนนี้ ฉันกำลังระบายสีเซลล์ที่มีสีล่วงหน้า สีแดง ทีละเซลล์ แต่การดำเนินการนี้ใช้เวลานานและโค้ดเช่น:

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

ฉันสงสัยว่ามีวิธีที่ดีกว่าในการแทนที่ backColor หรือไม่ ใครสามารถช่วยได้บ้าง?

นี่คือตัวอย่าง (เลียนแบบ) DataGridView

เซลล์สีเขียวไม่ถูกแทนที่โดยแถวสีแดง

ผู้ที่ไม่ผ่านเงื่อนไขแรกจะถูกทำให้เป็นสีแดงทั้งแถวโดยอัตโนมัติ และนั่นก็ได้ผล อย่างไรก็ตาม หากผ่านเงื่อนไขแรกและทำให้เซลล์ "Passed1" เป็นสีเขียว แล้วไม่ผ่านเงื่อนไขที่สอง อย่างที่คุณเห็น เซลล์เหล่านั้นจะยังคงเป็นสีเขียว ฉันต้องการให้ทั้งแถวเป็นสีแดง และเขียนทับเซลล์ที่เติมสีไว้เป็นสีเขียวให้เป็นสีแดงด้วยซ้ำ


person Mika Jones    schedule 21.09.2017    source แหล่งที่มา
comment
ก) อธิบาย 'สีที่เตรียมไว้'! b) ดู ที่นี่เพื่อดูตัวอย่างการระบายสีเซลล์ในเหตุการณ์ CellPainting หากคุณเขียนโค้ดตามเงื่อนไขครบก็ควรจะเพียงพอแล้ว   -  person TaW    schedule 21.09.2017
comment
หากใช้ BackColor ใหม่กับเซลล์ (หมายถึงการลงสีล่วงหน้า) BackColor ของเซลล์นั้นจะไม่สามารถเปลี่ยนเป็นสีอื่นได้ แม้ว่าฉันจะพยายามระบายสีทั้งแถวรวมถึงเซลล์นั้นด้วย myDataGridView.Rows[i].DefaultCellStyle.BackColor   -  person Mika Jones    schedule 21.09.2017
comment
นั่นจะเป็นความแตกต่างระหว่างค่าเริ่มต้นและค่าที่ถูกแทนที่ ใช้เซลล์ BackColor เพื่อแทนที่ค่าเริ่มต้นหรือการเปลี่ยนแปลงก่อนหน้า! นอกจากนี้: พยายามรวมสีทั้งหมดไว้ใน CellPainting   -  person TaW    schedule 21.09.2017
comment
ในภาพที่ฉันแนบในโพสต์ แถวที่มี ID:2, 4 และ 5 ไม่สามารถใส่สีแดงได้ทั้งหมด และเซลล์ Passed1 ยังคงเป็นสีเขียว   -  person Mika Jones    schedule 21.09.2017
comment
ถ้าคุณแค่เปลี่ยนสีของเซลล์เป็นสีเขียว แค่เซลล์นั้นก็เปลี่ยน ไม่ใช่ทั้งแถว โปรดอ่าน วิธีถาม และอ่าน ทัวร์   -  person Ňɏssa Pøngjǣrdenlarp    schedule 21.09.2017
comment
@Plutonix ฉันรู้แล้ว ฉันแค่สงสัยว่าเหตุใดการเปลี่ยนสีกับทั้งแถวจึงไม่ส่งผลกระทบต่อเซลล์ที่มี backColor อยู่แล้ว ฉันเดาว่าภาษาอังกฤษของฉันไม่ดีไม่สมเหตุสมผล...   -  person Mika Jones    schedule 21.09.2017
comment
โปรดอ่าน วิธีถาม และอ่าน ทัวร์. เราไม่มีบริบทมากนักเมื่อคุณกำลังทำอะไร....ซึ่งเป็นสิ่งสำคัญในการเขียนโปรแกรมที่ขับเคลื่อนด้วยเหตุการณ์ ฉันจะไม่วนซ้ำทุกแถวเพื่อเริ่มต้นด้วยเพราะมันไม่มีประสิทธิภาพ   -  person Ňɏssa Pøngjǣrdenlarp    schedule 21.09.2017


คำตอบ (2)


สีพื้นหลังของเซลล์จะมีลำดับความสำคัญเมื่อมีการวาดเซลล์ เริ่มต้นที่ด้านบน มันจะไล่เรียงลงมาตามรายการจนกระทั่งสีถูกตั้งค่า*:

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

* รายการนี้ไม่ครอบคลุมและอาจไม่รวมคุณสมบัติการเข้าถึง BackColor ทุกรายการที่เป็นไปได้


เป็นไปได้ว่าคุณกำลังทำอะไรบางอย่างที่คล้ายกับการตั้งค่า Cell.Style.BackColor สำหรับเซลล์ในคอลัมน์ Passed1 จากนั้นจึงเป็นตรรกะของโค้ดที่คุณโพสต์ ซึ่งให้ผลลัพธ์เหมือนที่คุณเห็นเพราะ Green มีลำดับความสำคัญสูงกว่า Red ที่ได้ตั้งค่าไว้:

เซลล์สีเขียวไม่ถูกแทนที่โดยแถวสีแดง

สมมติว่าเงื่อนไขของคุณสำหรับ Passed คอลัมน์ทั้งสองเป็นไบนารี่ (Yes หรือ No) คุณสามารถแก้ไขได้โดย "ลด" ลำดับความสำคัญของพื้นหลัง Green ด้วยการตั้งค่า 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;
        }
    }
}

ซึ่งส่งผลให้:

เซลล์สีเขียวถูกแทนที่โดยแถวสีแดง

person OhBeWise    schedule 21.09.2017
comment
ขอบคุณ! นี่คือคำตอบที่ฉันต้องการ ฉันไม่รู้ว่ามีลำดับความสำคัญ นั่นเป็นสาเหตุที่ทำให้เกิดปัญหาของฉัน ฉันดีใจที่คุณเข้าใจคำถามของฉันถูกต้อง - person Mika Jones; 22.09.2017
comment
ด้วยความเป็นธรรม ฉันไม่เคยพบรายการคำสั่งซื้อนี้เลยแม้แต่ในการค้นหาเอกสาร MSDN เลย ฉันรู้จากการลองผิดลองถูกเท่านั้น - person OhBeWise; 22.09.2017
comment
ฉันแค่อยากจะขอบคุณอีกครั้ง ฉันกำลังทำงานในโปรเจ็กต์ใหม่ และมีปัญหาที่คล้ายกันมากในเรื่องนี้ และฉันกลับมาที่ลำดับความสำคัญนี้ และแก้ไขปัญหาได้ทันที ขอบคุณขอบคุณขอบคุณ. - person Mika Jones; 18.10.2017
comment
ที่น่ากลัว! ดีใจที่ได้ช่วยเหลือ :) - person OhBeWise; 18.10.2017
comment
@OhBeWise มีปัญหาที่คล้ายกัน โดยส่วนตัวแล้วฉันคิดว่ามันแปลกที่ล่าสุดไม่ได้เขียนทับ - person A.bakker; 10.01.2020

มีปัญหากับตัวควบคุม datagridview เนื่องจากคุณไม่สามารถเปลี่ยนสีของเซลล์ใดๆ ได้จนกว่าจะแสดงแบบฟอร์มโดยใช้คุณสมบัติ DefaultCellStyle ดังนั้นเมธอดที่รันหรือเหตุการณ์ที่เริ่มทำงานก่อนเรียกใช้ Shown() จะไม่เปลี่ยนสี นั่นอาจเป็นปัญหา คุณอาจต้องสร้างวิธีการระบายสีและเรียกมันก่อน Shown()

person Dimitris Baltas    schedule 21.09.2017