Отключение элемента со списком на основе состояния флажка в C # - PullRequest
1 голос
/ 11 июля 2019

Я новичок в c # winforms. У меня есть сценарий, в котором мне нужно отключить определенные элементы поля со списком на основе состояния флажка.

У меня есть пять флажков, а именно флажок 1, флажок 2, флажок 3, флажок 4, флажок 5 и пять элементов в комбинированном окне, а именно: элемент 1, элемент 2, элемент 3, элемент 4, элемент 5.

Если флажок 1 снят, элемент 1 должен быть отключен, и то же самое применимо ко всем остальным элементам комбинированного списка. Я пытаюсь этот код, но не удалось достичь того, что я хочу, кто-нибудь может мне помочь? Спасибо.

private void ComboBox_SelectNode_DrawItem(object sender, DrawItemEventArgs e)
        {
            ComboBox comboBox = (ComboBox)sender;
            if (e.Index == 0)
            {
                if (this.isNode0Disabled)
                {
                    e.Graphics.DrawString(this.ComboBox_SelectNode.Items[e.Index].ToString(), this.myFont, Brushes.LightGray, e.Bounds);
                }
                else
                {
                    e.DrawBackground();
                    e.Graphics.DrawString(this.ComboBox_SelectNode.Items[e.Index].ToString(), this.myFont, Brushes.Black, e.Bounds);
                    e.DrawFocusRectangle();
                }

            }

            if (e.Index == 1)
            {
                if (this.isNode1Disabled)
                {
                    e.Graphics.DrawString(this.ComboBox_SelectNode.Items[e.Index].ToString(), this.myFont, Brushes.LightGray, e.Bounds);
                }
                else
                {
                    e.DrawBackground();
                    e.Graphics.DrawString(this.ComboBox_SelectNode.Items[e.Index].ToString(), this.myFont, Brushes.Black, e.Bounds);
                    e.DrawFocusRectangle();
                }

            }

            if (e.Index == 2)
            {
                if (this.isNode2Disabled)
                {
                    e.Graphics.DrawString(this.ComboBox_SelectNode.Items[e.Index].ToString(), this.myFont, Brushes.LightGray, e.Bounds);
                }
                else
                {
                    e.DrawBackground();
                    e.Graphics.DrawString(this.ComboBox_SelectNode.Items[e.Index].ToString(), this.myFont, Brushes.Black, e.Bounds);
                    e.DrawFocusRectangle();
                }

            }

            if (e.Index == 3)
            {
                if (this.isNode3Disabled)
                {
                    e.Graphics.DrawString(this.ComboBox_SelectNode.Items[e.Index].ToString(), this.myFont, Brushes.LightGray, e.Bounds);
                }
                else
                {
                    e.DrawBackground();
                    e.Graphics.DrawString(this.ComboBox_SelectNode.Items[e.Index].ToString(), this.myFont, Brushes.Black, e.Bounds);
                    e.DrawFocusRectangle();
                }

            }

            if (e.Index == 4)
            {
                if (this.isNode4Disabled)
                {
                    e.Graphics.DrawString(this.ComboBox_SelectNode.Items[e.Index].ToString(), this.myFont, Brushes.LightGray, e.Bounds);
                }
                else
                {
                    e.DrawBackground();
                    e.Graphics.DrawString(this.ComboBox_SelectNode.Items[e.Index].ToString(), this.myFont, Brushes.Black, e.Bounds);
                    e.DrawFocusRectangle();
                }

            }


        }

private void ComboBox_SelectNode_SelectedIndexChanged(object sender, EventArgs e)
        {
                if (this.ComboBox_SelectNode.SelectedIndex == 0)
                {
                    if (this.isNode0Disabled)
                    {
                        this.ComboBox_SelectNode.SelectedIndex = -1;
                    }
                }

                if (this.ComboBox_SelectNode.SelectedIndex == 1)
                {
                    if (this.isNode1Disabled)
                    {
                        this.ComboBox_SelectNode.SelectedIndex = -1;
                    }
                }

                if (this.ComboBox_SelectNode.SelectedIndex == 2)
                {
                    if (this.isNode2Disabled)
                    {
                        this.ComboBox_SelectNode.SelectedIndex = -1;
                    }
                }

                if (this.ComboBox_SelectNode.SelectedIndex == 3)
                {
                    if (this.isNode3Disabled)
                    {
                        this.ComboBox_SelectNode.SelectedIndex = -1;
                    }
                }

                if (this.ComboBox_SelectNode.SelectedIndex == 4)
                {
                    if (this.isNode4Disabled)
                    {
                        this.ComboBox_SelectNode.SelectedIndex = -1;
                    }
                }
          }

    private void CheckBox_Node0_CheckedChanged(object sender, EventArgs e)
    {

                if (this.checkBox_Node0.Checked == true)
                {
                    this.isNode0Disabled = false;
                }

                if (this.checkBox_Node0.Checked == false)
                {
                    this.isNode0Disabled = true;
                }

     }

Модифицированный код:

 private void ComboBox_SelectNode_DrawItem(object sender, DrawItemEventArgs e)
        {
            TextFormatFlags comboTRFlags = TextFormatFlags.Left | TextFormatFlags.VerticalCenter;
            if (e.Index < 0)
            {
                return;
            }

            var combo = sender as ComboBox;
            bool isCheckBoxChecked = this.comboCheckBoxes[e.Index].Checked;
            if (isCheckBoxChecked)
            {
                e.DrawBackground();
            }
            else
            {
                using (var brush = new SolidBrush(combo.BackColor))
                {
                    e.Graphics.FillRectangle(brush, e.Bounds);
                }
            }

            string itemText = combo.GetItemText(combo.Items[e.Index]);
            Color textColor = isCheckBoxChecked ? e.ForeColor : SystemColors.GrayText;
            TextRenderer.DrawText(e.Graphics, itemText, combo.Font, e.Bounds, textColor, comboTRFlags);
        }

        private void ComboBox_SelectNode_MeasureItem(object sender, MeasureItemEventArgs e)
        => e.ItemHeight = this.ComboBox_SelectNode.Font.Height + 4;

И объявил событие следующим образом:

this.ComboBox_SelectNode.DrawItem += new DrawItemEventHandler(ComboBox_SelectNode_DrawItem);
            this.ComboBox_SelectNode.MeasureItem += new MeasureItemEventHandler(ComboBox_SelectNode_MeasureItem);
private CheckBox[] comboCheckBoxes;
this.comboCheckBoxes = new[] {this.checkBox_Node0, this.checkBox_Node1, this.checkBox_Node2, this.checkBox_Node3 , this.checkBox_Node4};

Но когда я запускаю приложение, эти события не запускаются.

1 Ответ

1 голос
/ 11 июля 2019

Вы, вероятно, упростите свою жизнь (и код станет проще), если вы добавите свои CheckBox в коллекцию, чтобы вы могли проверить состояние CheckBox, извлекая его из коллекции, используя индекс * 1001.* paired Элемент ComboBox.
Примерно так, с использованием массива элементов управления CheckBox:
(Конечно, адаптировать имена CheckBoxes к вашему дизайну)

private CheckBox[] comboCheckBoxes;
public form1()
{
    InitializeComponent();
    comboCheckBoxes = new[] { chkFirst, chkSecond, chkThird, chkFourth, chkLast};
}

Затем вы можете выбратьстиль текста каждого элемента перед его рисованием.

Я использую TextRenderer.DrawText для рисования текста элементов: выравнивание текста корректно отображается с использованием этого метода вместо Graphics.DrawString().

TextFormatFlags comboTRFlags = TextFormatFlags.Left | TextFormatFlags.VerticalCenter;

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    if (e.Index < 0) return;
    var combo = sender as ComboBox;
    bool isCheckBoxChecked = comboCheckBoxes[e.Index].Checked;
    if (isCheckBoxChecked) {
        e.DrawBackground();
    }
    else {
        using (var brush = new SolidBrush(combo.BackColor)) {
            e.Graphics.FillRectangle(brush, e.Bounds);
        }
    }
    string itemText = combo.GetItemText(combo.Items[e.Index]);
    Color textColor = isCheckBoxChecked ? e.ForeColor : SystemColors.GrayText;
    TextRenderer.DrawText(e.Graphics, itemText, combo.Font, e.Bounds, textColor, comboTRFlags);
}

private void comboBox1_MeasureItem(object sender, MeasureItemEventArgs e) 
    => e.ItemHeight = comboBox1.Font.Height + 4;

private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
{
    if (!comboCheckBoxes[comboBox1.SelectedIndex].Checked) {
        comboBox1.SelectedIndex = -1;
        return;
    }
}

Вот как это работает:

CheckBox ComboBox Item enable disable

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...