CheckBox Checked во вложенных в MenuItem

98
02 сентября 2021, 14:10

Подскажите как сделать что бы при нажатии на CheckBox "File" в состоянии false со всех других в "Sub Menu" снимались галочки и если последних элемент в "Sub Menu" перевожу в false он CheckBox "File" меняет тоже в false?

И если будут замечания как стоит правильно оформлять код, подскажите, а то в институте, ни слова за написание кода не говорят, все самому приходится рефакторить.

public partial class Form1 : Form
{
    private CheckBox checkBox1;
    private Label label1;
    private CheckBox checkBox2;
    private CheckBox checkBox3;
    private Label label3;
    private Panel panel4;
    private Label label2;
    private CheckBox checkBox_New;
    private CheckBox checkBox_Save;
    private CheckBox checkBox_Exit;
    private CheckBox checkBox_SaveAs;
    private CheckBox checkBox_Open;
    private CheckBox checkBox_Find;
    private CheckBox checkBox_Undo;
    private CheckBox checkBox_Paste;
    private CheckBox checkBox_Copy;
    private CheckBox checkBox_Redo;
    private CheckBox checkBox__Cut;
    private CheckBox checkBox_ArrangeIcons;
    private CheckBox checkBox_Cascade;
    private CheckBox checkBox_Title;
    private CheckBox checkBox_Next;
    private CheckBox checkBox_MinimizeAll;
    private Button button_Cancel;
    private Button button_OK;
    private Panel panel3;
    private Panel panel2;
    private Panel panel1;
    private MainMenu mainMenu = new MainMenu();
    AppConfig appConfig;
    public Form1()
    {
        InitializeComponent();
        var menuItemFile = new MenuItem("File",
            new[]
            {
                    new MenuItem("New"), new MenuItem("Open"), new MenuItem("Save"), new MenuItem("Save As"),
                    new MenuItem("Exit"),
            })
        { Visible = false };
        var menuItemEdit = new MenuItem("Edit",
            new[]
            {
                    new MenuItem("Copy"), new MenuItem("Past"), new MenuItem("Cut"), new MenuItem("Undo"),
                    new MenuItem("Redo"), new MenuItem("Find"),
            })
        { Visible = false };
        var menuItemWindows = new MenuItem("Windows",
            new MenuItem[]
            {
                    new MenuItem("Title"), new MenuItem("Cascade"), new MenuItem("Minimize All"),
                    new MenuItem("Arrange Icon"), new MenuItem("Next"), new MenuItem("Find"),
            })
        { Visible = false };

        mainMenu.MenuItems.Add(menuItemFile);
        mainMenu.MenuItems.Add(menuItemEdit);
        mainMenu.MenuItems.Add(menuItemWindows);
        this.Menu = mainMenu;
        MenuItemHide();
        appConfig = Load();
        checkBox1.Checked = appConfig.isFile;
        checkBox2.Checked = appConfig.isEdit;
        checkBox3.Checked = appConfig.isWindows;
        checkBox_New.Checked = appConfig.isNew;
        checkBox_Save.Checked = appConfig.isSave;
        checkBox_Exit.Checked = appConfig.isExit;
        checkBox_SaveAs.Checked = appConfig.isSaveAs;
        checkBox_Open.Checked = appConfig.isOpen;
        checkBox_Find.Checked = appConfig.isFind;
        checkBox_Undo.Checked = appConfig.isUndo;
        checkBox_Paste.Checked = appConfig.isPast;
        checkBox_Copy.Checked = appConfig.isCopy;
        checkBox_Redo.Checked = appConfig.isRedo;
        checkBox__Cut.Checked = appConfig.isCut;
        checkBox_ArrangeIcons.Checked = appConfig.isArrangeIcons;
        checkBox_Cascade.Checked = appConfig.isCascade;
        checkBox_Title.Checked = appConfig.isTitle;
        checkBox_Next.Checked = appConfig.isNext;
        checkBox_MinimizeAll.Checked = appConfig.isMinimizeAll;
    }
    public void Save(AppConfig appConfig)
    {
        appConfig.isFile = checkBox1.Checked;
        appConfig.isEdit = checkBox2.Checked;
        appConfig.isWindows = checkBox3.Checked;
        appConfig.isNew = checkBox_New.Checked;
        appConfig.isSave = checkBox_Save.Checked;
        appConfig.isExit = checkBox_Exit.Checked;
        appConfig.isSaveAs = checkBox_SaveAs.Checked;
        appConfig.isOpen = checkBox_Open.Checked;
        appConfig.isFind = checkBox_Find.Checked;
        appConfig.isUndo = checkBox_Undo.Checked;
        appConfig.isPast = checkBox_Paste.Checked;
        appConfig.isCopy = checkBox_Copy.Checked;
        appConfig.isRedo = checkBox_Redo.Checked;
        appConfig.isCut = checkBox__Cut.Checked;
        appConfig.isArrangeIcons = checkBox_ArrangeIcons.Checked;
        appConfig.isCascade = checkBox_Cascade.Checked;
        appConfig.isTitle = checkBox_Title.Checked;
        appConfig.isNext = checkBox_Next.Checked;
        appConfig.isMinimizeAll = checkBox_MinimizeAll.Checked;
        var jsonFormatter = new DataContractJsonSerializer(typeof(AppConfig));
        using (var file = new FileStream("config.json", FileMode.Create))
        {
            jsonFormatter.WriteObject(file, appConfig);
        }
    }
    public new AppConfig Load()
    {
        var jsonFormatter = new DataContractJsonSerializer(typeof(AppConfig));
        using (var file = new FileStream("config.json", FileMode.OpenOrCreate))
        {
            if (file.Length > 0)
            {
                return (AppConfig)jsonFormatter.ReadObject(file);
            }
        }
        return new AppConfig();
    }
    private void MenuItemHide()
    {
        foreach (MenuItem elementMenu in this.Menu.MenuItems)
        {
            elementMenu.Visible = false;
            foreach (MenuItem element in elementMenu.MenuItems)
            {
                element.Visible = false;
            }
        }
    }
    private void CheckBoxCheckedChanged(object sender, System.EventArgs e)
    {
        CheckBox box = sender as CheckBox;
        foreach (MenuItem elementMenu in this.Menu.MenuItems)
        {
            if (box != null && elementMenu.Text == box.Text)
            {
                if (box.Checked)
                {
                    elementMenu.Visible = true;
                }
                else
                {
                    elementMenu.Visible = false;
                }
            }
            if (elementMenu != null)
            {
                foreach (MenuItem element in elementMenu.MenuItems)
                {
                    if (box.Text == element.Text)
                    {
                        if (box.Checked)
                        {
                            element.Visible = true;
                        }
                        else
                        {
                            element.Visible = false;
                        }
                    }
                }
            }
        }
    }
    private void button_OK_Click(object sender, System.EventArgs e)
    {
        Save(appConfig);
        this.Close();
    }
    private void button_Cancel_Click(object sender, System.EventArgs e)
    {
        this.Close();
    }
}
Answer 1
  1. Для снятия со всех чекбоксов галочки: Нужно создать условие: если file = true, то выключать конкретные чекбоксы. Думаю тут ничего сложного нет.
  2. Чтобы перевести file в положение false, надо также сделать проверку на перевод всех чекбоксов (которые нужны) в положение false через логическое and. Грубо говоря, логика такая: если все чекбоксы false, то file = false, иначе если все чекбоксы true, то file = true, иначе file = false.

А по оформлению кода могу сказать одно: он должен быть читаем. Добавь комментарии к коду в некоторых местах (особенно в логике нужно) с пояснением, чтобы можно было с легкостью ориентироваться в коде

READ ALSO
Как найти ошибку в запросе?

Как найти ошибку в запросе?

Есть большой запрос, который не работаетВ исключении написано что {"ORA-00911: неверный символ"}

172
Как в основной форме Отменить backgroundWorker другой формы

Как в основной форме Отменить backgroundWorker другой формы

РебятаМне нужно отменить BakgroundWorker из основной формы, которая была запущена в другой форме

307
Какой смысл от использования объектов в качестве ключа?

Какой смысл от использования объектов в качестве ключа?

Открыл исходник одного из компонента WinForms и увидел это:

164
исключить значение

исключить значение

в столбце "отправитель" и "получатель" встречаются одинаковые фамилии (когда перевод осуществляется родственникуНапример:

169