سؤال

انا املك DataGridView مرتبط بقائمة من الكائنات ، وأنا أقوم بتعيين لون خلفية خلية ديناميكية باستخدام CellFormatting الحدث ، كما في هذا الجواب. هذا يعمل بشكل جيد لكل عمود باستثناء DataGridViewCheckboxColumn. عندما أنقر داخل هذه الخلية (ولكن خارج خانة الاختيار) ، تتغير خلفية الخلية إلى اللون الأبيض الافتراضي.

يبدو بصريًا أن اختيار الخلايا يحدث ، على الرغم من بذل قصارى جهدي لإيقافه. يعين رمز تنسيق الخلايا الخاص بي SelectionBackColor وكذلك BackColor. لقد قمت بتعطيل اختيار الخلايا باستخدام CellStateChanged الحدث ، ولا يمكن اختيار أي من الأعمدة الأخرى:

private void PlayerGrid_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e)
{
    if (e.StateChanged == DataGridViewElementStates.Selected)
       e.Cell.Selected = false;
}

هل هناك حل بديل إضافي لتجاوز سلوك الخلية لمربحات الاختيار؟

هل كانت مفيدة؟

المحلول

لقد وجدت حلًا عن طريق إضافة الكود التالي إلى CellStateChanged حدث:

if (e.Cell is DataGridViewCheckBoxCell)
      e.Cell.Style.BackColor = BackgroundColor(e.Cell.RowIndex);

(BackgroundColor() يحسب لون خلفية الخلية بناءً على الصف.)

هذا يشفي المشكلة ، ولكنه قد يتسبب في مشكلات في الأداء للجداول الأكبر أو الافتراضية ، عن طريق التسبب في إنشاء كائنات نمط إضافية.

نصائح أخرى

أنا أفضل هذا النهج لما أفعله. إنه قادر على تغيير لون الخلفية بشكل لذيذ (بما في ذلك مربع الاختيار) لأي من خلايا DataGridView مع نقرة الماوس أو علامة التبويب-على سبيل المثال-لتسليط الضوء على الخلية المحددة حاليًا. لقد وجدت مقاربات أخرى بشكل غريب لم تلون خلفية مربع الاختيار حيث تم تلوين أنواع الخلايا الأخرى. في المثال الخاص بي ، أستخدم هذا النهج في حدث cellformatting ولكني أعتقد أن بناء جملة مماثل يمكن تكراره بالنجاح في مكان آخر. وأعتقد أيضًا أن هذا يجيب بشكل أوثق على سؤال OPS من حيث صلته ، على وجه التحديد ، حدث cellformatting.

void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
 {


if (W.mf.dgv.CurrentCell != null && e.RowIndex==W.mf.dgv.CurrentCell.RowIndex & e.ColumnIndex==W.mf.dgv.CurrentCell.ColumnIndex)
         {

                 W.mf.dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.SelectionBackColor = Color.YellowGreen;

         }
         else
         {
                 W.mf.dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.SelectionBackColor = W.mf.dgv.DefaultCellStyle.SelectionBackColor;

         }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top