ربما في بعض الاحيان تحتاج الي اضافة Controls مثلا Textboxes للصفحة و لكن لا تعلم عدد هذه ال TextBoxes الا في ال Run-Time
يمكنك استخدام ال Dynamic Web Controls اي انشاء الControls في ال Run-Time
و لكن سوف تحتاج الي التالي :
- تحتاج لانشاء ال controls في event متقدم من ال Page Life Cycle events مثلا زي Page_Init و ذلك لامكانية استخدام ال View State معهم
- تحتاج الي اعادة انشاء ال Dynamic Controls في كل Postback و ايضا تسميتهم بنفس الاسماء لامكانية معالجة ال View State الخاصة بهم
و يكون الكود بالشكل التالي
private void CreateTextBoxes(int count)
{
TextBox tb = null;
for (int i = 0; i < count; i++)
{
tb = new TextBox();
tb.ID = "txt" + i.ToString();
this.Panel1.Controls.Add(tb);
}
}و لكن من الافضل لو استطعت استخدام controls اخري لحل هذه المشكلة و بدون استخدام ال dynamic Controls مثلا زي استخدام ال Repeater او DataList او ListView
بفرض انك تحتاج صفحة تبدأ ب TextBox واحد و يوجد Button يضيف textbox للصفحة كلما تم الضغط عليه باستخدام ListView control
نقوم بالتعديل علي ال ListView في ال ItemTemplate و ال LayoutTemplate
و يكون الكود بالشكل التالي
<asp:ListView ID="lvDynamicTextboxes" runat="server" ItemPlaceholderID="itemPlaceholder"> <LayoutTemplate> <table> <asp:PlaceHolder ID="itemPlaceholder" runat="server"></asp:PlaceHolder> </table> </LayoutTemplate> <ItemTemplate> <tr> <asp:TextBox ID="txtText" runat="server"> </asp:TextBox> </tr> </ItemTemplate> </asp:ListView>
و نعرف Button بالشكل التالي
<asp:Button ID="btnAddTextBox" runat="server" Text="Add" onclick="btnAddTextBox_Click" />
ثم نكتب دالتين واحدة لعمل binding لل listview و الاخري لزيادة عدد ال textboxes
private void BindListView()
{
//get the current textbox count
int count = 1;
if (ViewState["textboxCount"] != null)
count = (int)ViewState["textboxCount"];
//create an enumerable range based on the current count
IEnumerable<int> enumerable = Enumerable.Range(1, count);
//bind the listview
this.lvDynamicTextboxes.DataSource = enumerable;
this.lvDynamicTextboxes.DataBind();
}
private void IncrementTextboxCount()
{
int count = 1;
if (ViewState["textboxCount"] != null)
count = (int)ViewState["textboxCount"];
count++;
ViewState["textboxCount"] = count;
}ملحوظة : Enumerable.Range دالة موجودة في framework 3.0 مع System.Linq و تستخدم لاستخراج مجموعة من الارقام (int) خلال مدي معين من الارقام
و الان استدعاء دالة BindListView في ال page load و ايضا استدعاء دالة IncrementTextboxCount و دالة BindListView في ال button click
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
this.BindListView();
}
}
protected void btnAddTextBox_Click(object sender, EventArgs e)
{
this.IncrementTextboxCount();
this.BindListView();
}و الكود التالي لاستخراج القيم من ال Textboxes
private IList<string> GetValues()
{
List<string> values = new List<string>();
TextBox txt = null;
foreach (ListViewItem item in this.lvDynamicTextboxes.Items)
{
if (item is ListViewDataItem)
{
txt = (TextBox)item.FindControl("txtText");
values.Add(txt.Text);
}
}
return values;
}بالتوفيق

