我在页面视图中创建了一个面板(tour.aspx文件)。 现在我想在我的类文件(add_tour.cs文件)中访问它。
这是我的小组:
<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 :(得分: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。
这使您的textbox_generator
无需了解有关特定网页的任何信息。
另外,您应该将命名约定与C#标准对齐。使用PascalCasing。 textbox_generator
应为TextBoxGenerator
等。如果不需要访问其类的任何字段或属性,您可以将textbox_generator
置为静态方法。
答案 1 :(得分: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#。但是,让方法以这种方式修改状态通常是一个坏主意。