C # ASP.NET GetType () с проблемой WebUserControl - PullRequest
0 голосов
/ 09 февраля 2011

В проекте у меня есть несколько пользовательских WebUserControls для элементов формы (они содержат некоторые стандартные валидаторы и другие системные функции).Мои пользовательские элементы управления - «DropDownListField» и «TextBoxField».В коде страницы у меня есть этот код:

string parameterValue = null;
foreach (object control in myMultiView.Views[myMultiView.ActiveViewIndex].Controls)
{
    if (control.GetType() == typeof(DropDownListField))
        parameterValue = ((DropDownListField)control).Value;
    if (control.GetType() == typeof(TextBoxField))
        parameterValue = ((TextBoxField)control).Value;
}

По какой-то причине операторы "if" всегда возвращают false, даже когда я перехожу через код и вижу, что "контроль" назначается моей сетипользовательский контроль.Этот код в другом месте проекта точно такой же, за исключением того, что в другом месте используются стандартные элементы управления .net «TextBox» и «DropDownList», а в другом месте код работает.

Кто-нибудь знает, почемуэто не будет работать с пользовательскими веб-элементами управления?

ОБНОВЛЕНИЕ: Хм, поэтому при отладке я обнаружил следующее:

?control.GetType();
BaseType: {Name = "DropDownListField" FullName = "WebUI.UserControls.Fields.DropDownListField"}
?typeof(DropDownListField);
BaseType: {Name = "UserControl" FullName = "System.Web.UI.UserControl"}

Так что typeof просто признает, что это пользовательские элементы управления, а не полный тип, как кажется.

Кто-нибудь знает, как я проверю определенный тип пользовательского элемента управления?

Ответы [ 3 ]

3 голосов
/ 09 февраля 2011

Я предполагаю, что они не одного типа, используйте отладку, чтобы узнать фактический тип.

Кроме того, попробуйте вместо этого использовать ключевое слово " is ".

2 голосов
/ 09 февраля 2011

PS: Вам может быть чище сказать, если (элемент управления DropDownListField)

Я не помню, включало ли представление непосредственно свои дочерние элементы в Controls, но я не удивлюсь, если бы Controls содержал только один элемент, который был бы контейнером некоторых видов. Следовательно, ваши элементы управления потенциально находятся в Controls [0]. Controls или даже ниже. Я бы посоветовал вам создать метод, который находит ребенка рекурсивно.

На самом деле, все ваши элементы управления должны реализовывать общий интерфейс (пример:

interface ICustomFieldWithValue { string Value {get; set; }}

). Ваш полученный код будет намного чище.

1 голос
/ 21 января 2014

c2.GetType (). ToString () == "System.Web.UI.WebControls.Label"

...