الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اضافة عدد غير معلوم من ال Controls في ال Run-time

بدأه AhmedElbaz في 21 أكتوبر 2008 · 2 رد · 652 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

ربما في بعض الاحيان تحتاج الي اضافة 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;
}

بالتوفيق

تم تعديل هذه المشاركة بواسطة AhmedElbaz في 21 أكتوبر 2008 في 13:51

#2

رائع جداً قمنا بأدراجهم ولكن كيف نتحكم بهم ونحن لا نعرف اساميهم بسبب اختلاف عددهم

joseph.gif

logo.gif

CCNA 640-802

مدونتي

#3
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;
}

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…