2017-02-12 5 views
1

Я создал панель в моем представлении страницы (файл tour.aspx). Теперь я хочу получить к нему доступ в моем файле класса (файл add_tour.cs).Как получить доступ к элементам управления asp в файле класса

Это моя панель:

<asp:Panel ID="itinerary_panel" runat="server"></asp:Panel> 

Это мой код за tour.aspx файла:

add_tour tour_obj = new add_tour(); 
int days_count = 2; 
tour_obj.textbox_generator(days_count); 

И этот код в add_tour.cs файле:

public void textbox_generator(int days_count) 
{ 

} 

Теперь, как получить доступ панель из файла aspx? Пожалуйста, помогите.

+0

Ваш класс не должен касаться элементов управления. Код позади должен обрабатывать сбор значений и передавать их другим классам. – mason

+0

то что мне делать? –

+0

Что ты имеешь в виду? Я просто сказал вам, что делать. – mason

ответ

1

Нет необходимости добавлять текстовые поля к панели этого класса.

public List<TextBox> textbox_generator(int days_count) 
{ 
    var textBoxes = new List<TextBox>(); 

    for(int i = 0; i < days_count; i++) 
    { 
     txt_desc = new TextBox(); 
     txt_desc.ID = "txt_desc" + i.ToString(); 
     txt_desc.CssClass = "form-control"; 
     txt_desc.Attributes.Add("placeholder", "Enter day " + i + " description"); 
     txt_desc.TextMode = TextBoxMode.MultiLine; 
     textBoxes.Add(txt_desc);   
    } 

    return textBoxes; 
} 

Затем измените код позади, чтобы:

add_tour tour_obj = new add_tour(); 
int days_count = 2; 
var textBoxes = tour_obj.textbox_generator(days_count); 
foreach(var textBox in textBoxes) 
{ 
    itinerary_panel.Controls.Add(textBox); 
} 

Обратите внимание, что вы должны быть осторожны, когда вы добавляете эти элементы жизненного цикла страницы. См. Microsoft documentation.

Это не дает вам знать, что нужно знать о конкретной странице.

Кроме того, вы должны согласовать свои соглашения об именах с стандартами C#. Используйте PascalCasing. textbox_generator должно быть TextBoxGenerator и т. Д. И вы, вероятно, можете сделать textbox_generator статическим методом, если ему не нужны никакие поля или свойства его класса.

+0

Спасибо @mason –

+0

Спасибо. Его работа ... :) –

1

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

public void textbox_generator(int days_count, Panel panel) 
{ 
    for(int i = 0; i < days_count; i++) 
    { 
     txt_desc = new TextBox(); 
     txt_desc.ID = "txt_desc" + i.ToString(); 
     txt_desc.CssClass = "form-control"; 
     txt_desc.Attributes.Add("placeholder", "Enter day " + i + " description"); 
     txt_desc.TextMode = TextBoxMode.MultiLine; 
     panel.Controls.Add(txt_desc);   
    } 
} 

и назвать это таким образом, из кода позади:

add_tour tour_obj = new add_tour(); 
int days_count = 2; 
var textBoxes = tour_obj.textbox_generator(days_count, itinerary_panel); 

Это работает, потому что на самом деле itinerary_panel является ссылкой на панели. См. Passing Objects By Reference or Value in C#. Тем не менее, часто бывает плохо, что метод может изменить состояние таким образом.

+0

да его работа ... и если я хочу получить значение из всех этих текстовых полей, то что мне использовать? Ajax или Page_PreInit? –

+0

Могу ли я спросить, почему вы используете веб-формы, а не MVC? – mason

+0

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

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