2015-12-15 2 views
0

Моя проблема очень проста. Я использую asp.net с C#.Передача динамического управления в качестве аргумента для пользовательского метода в C#

В моей странице у меня есть много элементов управления, как DropDownList, GridView, Repeater и т.д.

И в каком-то состоянии, я хочу, чтобы сбросить контроль как

DropDownList1.DataSource = null; 
DropDownList1.DataBind(); 

То, что я хочу, я хотел бы построить общий Method для сброса всех элементов управления, как:

void SomeMethod(Template T) 
{ 
    T.DataSource = null; 
    T.DataBind(); 
} 

Здесь T может быть любым из вышеупомянутых asp controls.

Я слышал, что это возможно, используя Template Type, но я понятия не имею, КАК !!!

Поэтому, пожалуйста, предложите решение.

ответ

4

Вы сбиваете с толку, как общие методы работают на C#. Я не думаю, что здесь применяются общие методы. Вы можете прочитать о том, как (и когда), чтобы использовать их здесь: https://msdn.microsoft.com/en-us/library/twcad0zb.aspx

Что касается вашего конкретного случая, то, кажется, что большинство элементов управления, которые поддерживают данные связывания являются производными от BaseDataBoundControl. Самым простым решением было бы создать метод, который принимает BaseDataBoundControl в качестве параметра, как так:

void SomeMethod(BaseDataBoundControl control) 
{ 
    control.DataSource = null; 
    control.DataBind(); 
} 

Одно исключение, которое я вижу из вашего вопроса является Repeater. Поскольку он не наследуется от BaseDataBoundControl, я бы использовал перегруженный метод, который принимает класс Repeater в качестве параметра.

void SomeMethod(Repeater control) 
{ 
    control.DataSource = null; 
    control.DataBind(); 
} 

В результате два простых методов, которые имеют такое же использование из других в вашем коде, независимо от того, если вы работаете на типах, полученных из BaseDataBoundControl или класса Repeater.

+0

о мой бог его довольно просто, большое спасибо –

3

Во-первых, вы должны найти общие class или interface из этих классов. Из моего небольшого исследования это DataBoundControl.

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

void SomeMethod<T>(T dataControl) where T : DataBoundControl 
{ 
    T.DataSource = null; 
    T.DataBind(); 
} 

Примечания:

  1. Использование DataBoundControl будет работать только для DropDownList, GridView и другие, которые наследуют от него. Repeater наследует непосредственно от Control класс.

  2. Вы можете использовать этот метод как extension method.

+0

спасибо так много –

2

Вы можете сделать это, как метод расширения, так что все GridBoundControls имеют доступный метод для них:

internal static class ExtenstionMethods 
{ 
    internal static void ClearData(this DataBoundControl control) 
    { 
     control.DataSource = null; 
     control.DataBind(); 
    } 
} 

Вы можете назвать это нравится:

grdReports.ClearData(); 
ddlAnswers.ClearData(); 
etc. 
+1

Хороший ответ. +1 Кроме того, вы также можете добавить, как OP может легко вызвать этот метод :) –

+0

искренне приятно Лучший ответ !!! –

 Смежные вопросы

  • Нет связанных вопросов^_^