LINUX.ORG.RU

[C#]. Аналог Controls на gtk

 , ,


0

2

Хочу перебрать нужные мне элементы на форме, в windows это делается так

foreach (var control in this.Controls)
{
      if (control is ComboBox)
      { 
               
      }
}
Я думал есть коллекции widgets для перебора, но не нашел. Как это можно осуществить? Заранее спасибо за ответы.

★★★★★

Последнее исправление: Landgraf (всего исправлений: 2)

Смотря на что ссылается this. Если это Window, то он наследуется от Bin, который внутри себя может содержать только один элемент. Нужно обращаться к свойству Child, и уже перебирать все контейнеры.

Patrick13
()

Зопили свою реализацию с коллекцией и итераторами, чо. Опенсорц же.

slackwarrior ★★★★★
()

Плохой способ, контролы могут иметь произвольную вложенность. На практике так никто не пишет.

encyrtid ★★★★★
()

в windows это делается так

Нет, в виндовс делается список нужных тебе контролов, который перебирается безо всяких

if (control is ComboBox)

anonymous
()
Ответ на: комментарий от anonymous

каким образом перебираются?

Landgraf ★★★★★
() автор топика
Ответ на: комментарий от soslow

Проблемы две. Это нарушение полиморфизма и оператор «is» очень медленный, чтобы его в цикле таким образом использовать.

is стоит использовать только в тех случаях, когда другого выхода нет. В остальных случаях это явный признак кривой архитектуры.

mono ★★★★★
()
Ответ на: комментарий от Landgraf

А зачем это делать? Какая изначальная задача?

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

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

mono ★★★★★
()
Последнее исправление: mono (всего исправлений: 1)
Ответ на: комментарий от Landgraf

http://sseyod.blogspot.ru/2009/08/gtk-how-to-enumerate-widgets.html

Смотри документацию Gtk# на предмет перечисленных там функций. Дада, потребуется рекурсия (в том или в ином виде), потому что виджеты в GTK образуют иерархию, дерево т.е.

Но в общем случае то, что ты хочешь - костыль.

yoghurt ★★★★★
()
Ответ на: комментарий от Landgraf
void iterate_children(GtkWidget* widget)
{
 if (!GTK_IS_CONTAINER(widget)) return;

 GList* children = gtk_container_get_children(GTK_CONTAINER(widget));
 GList* iter = children;
 while (iter != NULL) {
   printf("Widget %s\n", gtk_widget_get_name(iter->data));
   iterate_children(iter->data);
   iter = g_list_next(iter);
 }
}
Vitaly1988
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.