Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приведение типа в цикле foreach 
:(
    Опции темы
Vetal1
Дата 4.8.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 18.7.2008

Репутация: нет
Всего: нет



У меня есть коллекция контролов ModuleCollection, соответственно все объекты коллекции имеют разные типы. Нужно перебрать в цикле все контролы этой коллекции и в случае обнаружения в ней объекта с типом PlannerControl, установить свойство Visible этого контрола в положение True. Как это можно сделать? smile 
PM MAIL   Вверх
QryStaL
Дата 4.8.2008, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 14
Всего: 32



Код

foreach (object o in myCollection)
{
    if (o is PlannerControl)
    {
        ((PlannerControl)o).Visible = true;
    }
}


Это сообщение отредактировал(а) QryStaL - 4.8.2008, 12:02


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
Vetal1
Дата 4.8.2008, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 18.7.2008

Репутация: нет
Всего: нет



Отлично, спасибо!!! Еще один вопрос, мне остальные контролы надо будет скрыть при этом

Если я буду делать так:

Код

            foreach (object o in ModuleControlCollection)
            {
                if (o is PlannerControl)
                    ((PlannerControl)o).Visible = true;
                else
                    ((Control)o).Visible = false;
            }


то все контролы конвертанутся в тип Control(?). Мне бы желательно типы при этом не менять, потому как таких циклов на проверку к принадлежности типу будет несколько для разных контролов. Как мне можно установить свойство Visible в else-конструкции?

Это сообщение отредактировал(а) Vetal1 - 4.8.2008, 12:27
PM MAIL   Вверх
source777
Дата 4.8.2008, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Цитата(Vetal1 @  4.8.2008,  12:27 Найти цитируемый пост)
то все контролы конвертанутся в тип Control(?).
Нет, читай матчасть про приведение типов.

Цитата(Vetal1 @  4.8.2008,  12:27 Найти цитируемый пост)
таких циклов на проверку к принадлежности типу будет несколько для разных контролов.
Это будет тухлый код, подумай как решить задачу по иному...



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
QryStaL
Дата 4.8.2008, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 14
Всего: 32



Насколько я понял, у тебя все контролы наследуются от базового класса Control ? Тогда можно сделать так:

Код

public void DoAction<T>()
{
    foreach (Control c in myCollection)
    {
        c.Visible = (c is T) ? true : false;
    }
}



--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
Vetal1
Дата 4.8.2008, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 18.7.2008

Репутация: нет
Всего: нет



Во, это то что мне было нужно, спасибо еще раз!!!)

Цитата("source777")

Это будет тухлый код, подумай как решить задачу по иному...

Тухлый в каком месте, опыт программирования пока не большой, поэтому не вижу этих моментов...


Это сообщение отредактировал(а) Vetal1 - 4.8.2008, 12:51
PM MAIL   Вверх
Partizan
Дата 4.8.2008, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



можно ещё оптимизировать smile

Код

public void DoAction<T>()
{
    foreach (Control c in myCollection)
    {
        c.Visible = (c is T);
    }
}



--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
QryStaL
Дата 4.8.2008, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 14
Всего: 32



Partizan, согласен  smile 


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
source777
Дата 4.8.2008, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Цитата(Vetal1 @  4.8.2008,  12:49 Найти цитируемый пост)
Тухлый в каком месте, опыт программирования пока не большой, поэтому не вижу этих моментов...
Как раз в том месте, которое я процитировал... Куча бессмысленных циклов твой код не украсит, уж если есть такая необходимость, то делай всё за 1 проход, но скорее всего самой необходимости в этом нет...
P.S. А конкретные места можно будет указать только после того как ты напишешь код.



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Rififi
Дата 4.8.2008, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 5
Всего: 36



Цитата(Vetal1 @  4.8.2008,  13:49 Найти цитируемый пост)
Тухлый в каком месте

затруднено повторное использование кода

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

Код
private readonly List<Control> myCollection = new List<Control>();
public void DoAction<T>(Action<T> action) where T : Control
{
    myCollection.ForEach(delegate(Control it)
                          {
                              if (it is T)
                                  action(it as T);
                          });
}


Это сообщение отредактировал(а) Rififi - 4.8.2008, 16:35
PM MAIL   Вверх
mr.DUDA
Дата 4.8.2008, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



А можно мне свои пять копеек ??  smile 
Код
using System;
using System.Windows.Forms;

// пример использования
public class Program
{
    static void Main()
    {
        Form form = new Form();
        form.Controls.ForEach<TextBox>(textBox => textBox.Text = "");
        form.Controls.ForEach<ComboBox>(comboBox => comboBox.SelectedIndex = 0);
    }
}

// расширение для методов ControlsCollection
public static class ControlsEnumerationExtension
{
    public static void ForEach<T>(this Control.ControlCollection coll, Action<T> callback)
        where T : Control
    {
        foreach (Control ctl in coll)
        {
            if (ctl is T)
                callback((T)ctl);
        }
    }
}



--------------------
user posted image
PM MAIL WWW   Вверх
source777
Дата 4.8.2008, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Цитата(mr.DUDA @  4.8.2008,  17:32 Найти цитируемый пост)
form.Controls.ForEach<TextBox>(textBox => textBox.Text = "");
Да, C# 3.x рулит, такой код и читать приятно и комментарии излишни.. smile 



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1137 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.