Проверить все элементы в указанном проверенном списке С#

Я создал небольшую программу отображения кухни, которая отображает заказы на еду. Поэтому я динамически создал панель, которая содержит панель макета таблицы, содержащую отмеченный список и кнопку «Проверить все». Моя проблема в том, что... У меня есть кнопка «Проверить все» на каждой панели макета таблицы, созданная динамически, и каждый раз, когда я нажимаю ее, она проверяет все элементы в последнем созданном CheckedListBox, а не в том, на который нажали.

Это мой код:

p = new Panel();
p.Size = new System.Drawing.Size(360, 500);
p.BorderStyle = BorderStyle.FixedSingle;
p.Name = "panel";

tpanel = new TableLayoutPanel();
tpanel.Name = "tablepanel";

clb = new CheckedListBox();

tpanel.Controls.Add(b1 = new Button() { Text = "CheckAll" }, 1, 4);
b1.Name = "b1";
b1.Click += new EventHandler(CheckAll_Click);
b1.AutoSize = true;

private void CheckAll_Click(object sender, EventArgs e)
{

    var buttonClicked = (Button)sender;                        
    var c = GetAll(this, typeof(CheckedListBox));

    for (int i = 0; i < c.Count(); i++)
    {
        \\any help
    }
}

public IEnumerable<Control> GetAll(Control control, Type type)
{
    var controls = control.Controls.Cast<Control>();
    return controls.SelectMany(ctrl => GetAll(ctrl, type)).Concat(controls).Where(c => 
    c.GetType() == type);
}

person jim    schedule 26.09.2019    source источник
comment
он проверяет все элементы в последнем созданном контрольном списке, а не тот, по которому щелкнули Я не понимаю эту часть. А в чем твоя проблема? Метод GetAll() возвращает пустое значение или что? И это WinForm, верно?   -  person Phat Huynh    schedule 26.09.2019
comment
каждый раз, когда появляется новый заказ, новая панель создается динамически с указанными выше элементами (tablelayooutpanel + checklistbox и кнопка), поэтому, когда я получаю несколько заказов, я хочу проверить элементы в определенном порядке. например, если у меня есть 3 заказа, будет создано 3 панели. Итак, как я проверю все предметы во втором заказе. это моя проблема   -  person jim    schedule 26.09.2019
comment
Хорошо, я понимаю. Пожалуйста, подождите несколько минут для ответа :-)   -  person Phat Huynh    schedule 26.09.2019
comment
и да, это форма окна   -  person jim    schedule 26.09.2019


Ответы (1)


Сначала я опишу структуру
Order = TableLayoutPanel
TableLayoutPanel имеет 1 CheckAll Button и < strong>CheckListBox
И вы хотите, чтобы при нажатии CheckAll Button он проверял точно все элементы в текущей TableLayoutPanel.
Попробуйте этот код

class XForm : Form {
    // create Dictionary to store Button and CheckListBox
    IDictionary<Button, CheckListBox> map = new Dictionary<Button, CheckListBox> ();

    // when you create new order (new TableLayoutPanel)
    // just add map Button and CheckListBox to map
    private void CreateOrder () {
        var panel = new Panel ();
        panel.Size = new System.Drawing.Size (360, 500);
        panel.BorderStyle = BorderStyle.FixedSingle;
        panel.Name = "panel";

        var table = new TableLayoutPanel ();

        var checklistBox = new CheckedListBox ();
        var button = new Button () { Text = "CheckAll" };

        table.Controls.Add (button, 1, 4);
        button.Name = "b1";
        button.Click += new EventHandler (CheckAll_Click);
        button.AutoSize = true;
        map[button] = checklistBox;
    }

    // and on event handle
    private void CheckAll_Click (object sender, EventArgs e) {
        var buttonClicked = (Button) sender;
        var c = map[buttonClicked];
        if (c == null) return;
        for (int i = 0; i < c.Items.Count; i++)
        {
            c.SetItemChecked(i, true);
        }
    }
}

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

person Phat Huynh    schedule 26.09.2019
comment
в дескрипторе события, как я проверю все элементы в CheckListBox? можете ли вы предоставить мне остальную часть кода .. заранее спасибо - person jim; 26.09.2019