anil_kumar_bhakta Ответов: 5

Свойства Текстового Поля Winform


Привет Эксперты,

Моя winform имеет различные текстовые поля внутри панелей и снаружи панелей.
Я хочу установить их свойства, такие как backcolor, enabled и т. д., В отдельном классе.
но мы не можем этого сделать.

Я тоже пробовал вот так: "foreach(Control c in Controls)", но не может получить доступ к тому, что контрольные выходы в панели.

Будьте добры, предложите мне самое лучшее.

--- Анил Кумар.

Спасибо за оперативные ответы. В этом сценарии я уже реализовал успешный код для datagridview, как показано ниже: -

код формы, имеющие практическое руководство:
======================================
...
....
...
ConnetDataBase conDB = new ConnetDataBase();
...
...
conDB.FillDataGrid(Sql, dgvUserList);

код для класса: -
================
class ConnetDataBase
    {

public void FillDataGrid( string Sql,DataGridView dgvName)
{
    try
    {
        connection.Open();
        adapter = new SqlDataAdapter(Sql, connection);
        DataSet ds = new DataSet();
        adapter.Fill(ds);
         dgvName.DataSource = ds.Tables[0];
        connection.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

}

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

--- Анил Кумар

5 Ответов

Рейтинг:
33

Tarun.K.S

Этот фрагмент может вам помочь :

foreach (Control cntol in this.Controls)
{
    Type type = cntol.GetType();
    //if (type.Name == "Panel")
    if(cntol is Panel)
    {
        foreach (Control panelControls in cntol.Controls)
        {
            //Access the panel's controls here
        }
    }
    else
    {
        // Access the controls outside of the panels here
    }
}


Rojeh

Мой 5-й

Tarun.K.S

Спасибо!

Kim Togo

Мой 5. Но вместо этого
если (тип.Имя == "Панель")

Воспользуйся

если (cntrol - это панель)

тип.Имя по умолчанию пустое.

Tarun.K.S

Спасибо и конечно же я воспользуюсь этим сейчас. :)

BobJanova

Элементы управления, отличные от панелей, могут иметь подконтрольные элементы управления, хотя обычно они этого не делают. Почему бы просто не удалить тест if полностью и не пройти все поддеревья? Большинство из них в любом случае будут иметь массивы элементов управления 0.

Sergey Alexandrovich Kryukov

Тарун, вы покрываете только два уровня, но рекурсивная рекурсия не стоит больше и универсальна.
Кроме того, GetType неверен (и медленен). Это неверно, потому что это не полиморфная операция и не будет охватывать подклассы. Вам действительно нужно "как" динамическое приведение и ничего больше (даже "есть", потому что это повлечет за собой нежелательный дополнительный случай в следующей строке).
(Итак, я не голосовал, но ответ не проходит, так что вы должны что-то с этим сделать...)

Пожалуйста, посмотрите мое решение.
--СА

Tarun.K.S

Да, вы правы, СА, мне следовало бы использовать здесь рекурсию. Спасибо за указания, я буду иметь это в виду.

Sergey Alexandrovich Kryukov

Спасибо за понимание.
--СА

Рейтинг:
2

BobJanova

Цвет фона многих элементов управления наследуется, если вы не задаете его явно.

В общем случае, предполагая, что вы хотите установить эти свойства управления на основе чего-то в вашей бизнес-логике, лучше использовать привязку данных, чем писать явный код манипуляции свойствами, который может стать очень сложным и трудно синхронизировать удивительно быстро. Создайте класс presenter (или controller, или model-view) для формы или, возможно, больше, если он извлекает данные из логически различных местоположений, и данные свяжут свойства элементов управления со свойствами этого класса.


Sergey Alexandrovich Kryukov

Это полезные заметки, мой 5-й.
Функция настройки может быть любой, а не просто окрашивать все в один и тот же цвет (что не потребует никакого обхода элементов управления).
Хотя вы не полностью ответили на этот вопрос, но я, пожалуйста, понял.
--СА

BobJanova

Вы абсолютно правы, я не полностью ответил на вопрос, как написано, потому что в этом заключается безумие ;) но я считаю, что ваш ответ верен в том виде, в каком он есть.

Sergey Alexandrovich Kryukov

Ну, спасибо тебе, Боб.
Я понимаю ваш подход; вам не нужно было отвечать полностью; опять же, ваша информация полезна.
--СА

Рейтинг:
2

Sander Rossel

Я вижу здесь несколько хороших ответов. Таким образом, этот ответ просто добавляет к тому, что уже было сказано, что также работает. Однако в предыдущем примере кода, если вы будете использовать TabControl или GroupBox вместо панели, ваш код больше не будет работать. Следующий фрагмент кода, в котором используется рекурсивный метод, должен исправить это. C# - это не мой основной язык, потерпите меня, пожалуйста ;)

private void button1_Click(object sender, EventArgs e)
        {
            ColorControls(this); // A Form is also a Control.
        }

        private void ColorControls(Control ctl)
        {
        // Loop through the controls in a Control.
        foreach (Control c in ctl.Controls)
           if (c.Controls.Count > 0)
            {
                // If the control contains multiple Controls (Container Controls))
                // then loop through those controls.
                ColorControls(c);
            }
            else
            // If there are no more controls then check if
            // this control is a TextBox (or any type you want).
           {
                if (c is TextBox)
                {
                    // Set background color.
                    c.BackColor = Color.Red;
                }
            }
        }

Надеюсь, это поможет.


ricmil42

Да, работает для любого уровня вложенных элементов управления.

Sergey Alexandrovich Kryukov

Немного избыточного кода здесь, мой 4-й.
Нет необходимости проверять количество, "is" является избыточным: вам действительно нужно использовать "as", потому что он обеспечивает проверку и приведение одновременно. У вас вообще не было кастинга, потому что вы предполагаете, что свойство универсально. Но что делать, если какое-то свойство, которое нужно настроить, является специфичным для текстового поля? Таким образом, ваш код менее универсален без какой-либо выгоды.
Пожалуйста, смотрите мой ответ.
--СА

Рейтинг:
19

Sergey Alexandrovich Kryukov

В этом случае вам нужно использовать рекурсию:

static void SetupTextBox(TextBox textBox) {
   //text.Box.BackColor = ...
   //whatever setup you need
}
static void SetupTextBoxes(Control parent) {
   TextBox textBox = parent as TextBox;
   if (textBox != null)
      SetupTextBox(textBox);
   foreach(Control control in parent.Controls)
      SetupTextBoxes(control);
}

//...

SetupTextBoxes(myFormInstance);
or, in the method of your form:
SetupTextBoxes(this);


—СА


Sander Rossel

Очень милый. Никогда не смотрел на это так. 5 от меня.

Sergey Alexandrovich Kryukov

Спасибо.
Это просто и очень просто.
--СА

Sander Rossel

Простое мышление иногда может быть очень трудным! :смеяться:

Sergey Alexandrovich Kryukov

Кто бы мог возразить против этого!
Спасибо.
--СА

Espen Harlinn

В 5 :)

Sergey Alexandrovich Kryukov

Спасибо :-)
--СА

Tarun.K.S

Да, рекурсия! 5d.

Sergey Alexandrovich Kryukov

Спасибо тебе, Тарун.
--СА

anil_kumar_bhakta

Очень мило!

Sergey Alexandrovich Kryukov

Большое тебе спасибо, Анил.
--СА

Рейтинг:
1

Tom Deketelaere

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

Поэтому, чтобы заставить это работать, вам придется проверить тип элементов управления, и если это панель, вам придется снова просмотреть все элементы управления панелями.