Как я могу лучше контролировать поведение на нескольких элементах управления одновременно? - PullRequest
2 голосов
/ 25 июля 2011

Итак, у меня есть форма с некоторыми объектами табуляции, объектами группы и, возможно, панелью макета таблицы внутри объекта группы.

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

Вот код, который мне нужно пролистать в коллекциях и пометить объекты как только для чтения ...

    private void lockForm()
    {
        btnLockData.BackColor = Color.LightBlue;
        btnLockData.Text = "Data locked!  Click to unlock...";

        foreach (Control formObject in this.Controls)
        {
            if (formObject is TabControl)
            {
                foreach (Control tabControl in (formObject.Controls))
                {
                    foreach (Control tabPageObject in (tabControl.Controls))
                    {
                        if (tabPageObject is TextBox)
                            ((TextBox)tabPageObject).ReadOnly = true;

                        if (tabPageObject is DataGridView)
                            ((DataGridView)tabPageObject).ReadOnly = true;


                        if (tabPageObject is GroupBox)
                        {
                            foreach (Control groupBoxObject in tabPageObject.Controls)
                            {
                                if (groupBoxObject is TextBox)
                                    ((TextBox)groupBoxObject).ReadOnly = true;

                                if (groupBoxObject is DataGridView)
                                    ((DataGridView)groupBoxObject).ReadOnly = true;

                                if (groupBoxObject is TableLayoutPanel)
                                {
                                    foreach (Control layoutObject in groupBoxObject.Controls)
                                    {
                                        if (layoutObject is TextBox)
                                            ((TextBox)layoutObject).ReadOnly = true;

                                        if (layoutObject is DataGridView)
                                            ((DataGridView)layoutObject).ReadOnly = true;                                            
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        dgvResources.ReadOnly = false;
        dgvDirectLabor.ReadOnly = false;
    }

Есть ли лучший способ контролировать это поведение?

Ответы [ 2 ]

3 голосов
/ 25 июля 2011

Для более детального контроля того, какие элементы управления устанавливать только для чтения, попробуйте:

   this.Controls.Cast<Control>()
        .Where(ctl => ctl is TextBox).Cast<TextBox>().ToList()
        .ForEach(e => e.ReadOnly = true);

    this.Controls.Cast<Control>()
        .Where(ctl => ctl is DataGridView).Cast<DataGridView>().ToList()
        .ForEach(e => e.ReadOnly = true);
1 голос
/ 25 июля 2011

Это должно сделать трюк для WinForms:

var controls = from controls in this.Controls.OfType<Control>()
              select controls;
foreach(c in controls) { c.Enabled = false; }
...