Kunal Singha Roy Ответов: 7

Перебираем все формы в растворе


Я хочу перебрать все формы, присутствующие в моем решении, чтобы добавить имя формы, присутствующей в моем решении, в хэш-таблицу программно.как я могу это сделать?

Vivek Krishnamurthy

Здесь потребуется более подробная информация о том, когда и где вы создаете эту хэш-таблицу. Нужны ли вам эти данные во время выполнения / во время разработки? где / когда я имею в виду, находится ли он в режиме добавления visual studio во время выполнения ?

Sergey Alexandrovich Kryukov

Мы обсудили некоторые варианты его значения, которое до сих пор остается неопределенным; пожалуйста, смотрите мой ответ для объяснения.
--СА

7 Ответов

Рейтинг:
56

Sergey Alexandrovich Kryukov

Решение не состоит из форм, никакое зацикливание невозможно. Если у вас есть запущенное приложение формы, вы можете перечислить только открытые формы, используя Система.Окна.Формы.Приложение.OpenForms, видеть http://msdn.microsoft.com/en-us/library/system.windows.forms.application.aspx[^].

Вы также можете подсчитать классы форм, используя отражение. Вам это нужно?

С точки зрения времени выполнения такой вещи, как решение, не существует. С точки зрения решения, нет такой вещи, как форма, есть только набор файлов проекта, который имеет набор исходных файлов.

[РЕДАКТИРОВАТЬ]

Решение, предложенное ФИРО, возможно, но оно не может дать вам надежного результата. Вы можете создать форму, которая не имеет производного класса формы, вы можете создать класс формы, никогда не используя его. В связи с этим, какие именно формы вам нужно принять во внимание? Если один класс формы используется для создания двух разных форм, как вы хотите считать?

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

—СА


Firo Atrum Ventus

Я согласен с вами. Решение, которое я предложил, на самом деле просто способ проверить, какой класс включен в решение, а не сколько форм(вы можете проверить, какой класс наследует System.windows.form, но это все равно не даст вам надежного результата).

Sergey Alexandrovich Kryukov

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

Рейтинг:
2

Firo Atrum Ventus

Это довольно сложно

Моя рекомендация такова:
1. Читать .sln файл
2. найдите такие строки:(используйте регулярное выражение)

Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "MSK", "MSK\MSK.vbproj", "{0CD3E9B3-0340-43ED-9FAF-49E290122C30}"

3. Найти .каталог vbproj ("MSK\MSK.vbproj") (Используйте Регулярное Выражение)
4. Читать .файл vbproj
5. Найдите такие строки:(используйте регулярное выражение)
<Compile Include="controller\Controller.vb" />

или
<Compile Include="frmBuatRealisasiPDJMan.Designer.vb">
      <DependentUpon>frmBuatRealisasiPDJMan.vb</DependentUpon>
    </Compile>

6. Найти каталог .VB файлов(использовать regex)
7. Найти имя класса (при необходимости) от .VB файлов (использовать regex)
8. Поместите все, что вы хотите из пункта 6 или 7 в хэш-таблицу
9. повторяйте, пока не получите все, что хотели.


Sergey Alexandrovich Kryukov

Мой 4. Я не уверен, что в этом есть какой-то смысл. Что можно считать отдельной формой? В этом нет уверенности.
Я приписал ваше решение своему и прокомментировал его; пожалуйста, смотрите.
--СА

Рейтинг:
2

S Houghtelin

AFAIK, он не поддерживается в соответствии с Microsoft. Однако они предоставляют эту ссылку, которая может предоставить вам решение.

http://support.microsoft.com/kb/308537[^]


Рейтинг:
2

cod-jmjohnson

Лямбда - версия решения, опубликованная ицвивеком

Dim AllForms As Form() = Me.GetType().Assembly.GetTypes() _
    .Where(Function(t) t.BaseType Is GetType(Form)) _
    .Select(Function(t) New With
    {
        Key .Form = DirectCast(Activator.CreateInstance(t), Form)
    }).Select(Function(x) x.Form).ToArray()


Преобразовано в C#
Form[] allForms = this.GetType().Assembly.GetTypes()
    .Where(t => t.BaseType == typeof(Form))
    .Select(t => new
    {
        Form = (Form)Activator.CreateInstance(t)
    }).Select(x => x.Form).ToArray();


CHill60

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

cod-jmjohnson

Я изменил его. Спасибо, что предупредили.

Рейтинг:
1

OriginalGriff

Посмотрите на Приложение.OpenForms[^] собственность


Kunal Singha Roy

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

Sergey Alexandrovich Kryukov

Смотрите мой ответ. Вы хотите, чтобы я дал вам более подробную информацию по размышлению? Это очень просто.
--СА

Simon_Whale

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

Рейтинг:
1

Tarun.K.S

Взгляните на эту ссылку StackOverflow : http://stackoverflow.com/questions/4711979/get-all-forms-in-application-including-hidden-forms[^].


Рейтинг:
0

itzvivek

Попробовать это:

Dim allForms() As Form = (From t As Type In Me.GetType().Assembly.GetTypes() _
                                 Where t.BaseType Is GetType(Form) _
                                 Let f = DirectCast(Activator.CreateInstance(t), Form) _
                                 Select f).ToArray


Kornfeld Eliyahu Peter

Этому вопросу уже 4 года. На него тоже ответили, и один из ответов уже принят ОП...пожалуйста, не отвечайте, такие старые/отвеченные вопросы...Это может принести вам 10 очков репутации, но также может привести к запрету...

itzvivek

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

и спасибо, что предупредили !!

Хорошего дня

cod-jmjohnson

Отличный ответ, спасибо!