PDA

View Full Version : سوال: صفحه پویا



vafaei
یک شنبه 05 تیر 1390, 20:40 عصر
سلام
چطور می تونم تو صفحه یه عدد رو که خوندم که حداکثر n هست
به تعداد اون عدد ردیف و در هر ردیف هم m تا کنترل مثل لیبل یا Textbox ایجاد بشه

با تشکر

raziee
یک شنبه 05 تیر 1390, 21:58 عصر
سلام
چطور می تونم تو صفحه یه عدد رو که خوندم که حداکثر n هست
به تعداد اون عدد ردیف و در هر ردیف هم m تا کنترل مثل لیبل یا Textbox ایجاد بشه

با تشکر

protected void Page_Load(object sender, EventArgs e)
{
Table table = new Table();
TableRow row;
TableCell cell;
for (int i = 0; i < 10; i++)
{
row = new TableRow();
cell = new TableCell();
cell.Controls.Add(new LiteralControl(string.Format("Caption {0} : ", i)));
row.Cells.Add(cell);
TextBox txt = new TextBox();
cell = new TableCell();
cell.Controls.Add(txt);
row.Cells.Add(cell);
table.Rows.Add(row);
}
MyPlaceHolder.Controls.Add(table);
}

vafaei
شنبه 22 مرداد 1390, 14:09 عصر
سلام
من کد بالا رو به شکل زیر تغيير دادم.البته Table رو هم توی صفحه ام دارم.ID کنترل های ايجاد شده رو به برای ذخیره کردن مقدارشون توی بانک لازم دارم .چطور می تونم ID ها رو دست بیارم.




protected void Button1_Click(object sender, EventArgs e)

{



TableRow row;



TableCell cell;



for (int i = 0; i < 10; i++)

{

row =

new TableRow();

cell =

new TableCell();



TextBox txt = new TextBox();

cell =

new TableCell();

cell.Controls.Add(txt);

row.Cells.Add(cell);



TextBox tx = new TextBox();

cell =

new TableCell();

cell.Controls.Add(tx);

row.Cells.Add(cell);

Table1.Rows.Add(row);

}

}

ramin149
یک شنبه 06 شهریور 1390, 12:40 عصر
در خط زیر از کد raziee (http://barnamenevis.org/member.php?95909-raziee) به چه صورت یک css به کنترل اضافه می کنیم آیا این کار را می شه انجام داد یا اینکه از کنترل لیبل استفاده کنم ؟؟؟


cell.Controls.Add(new LiteralControl(string.Format("Caption {0} : ", i)));

dontspeak
یک شنبه 06 شهریور 1390, 12:57 عصر
رامین جان اونجایی که یه کنترل رو نمونه سازی می کنی همونجا باید براش استایلش رو تعریف کنی مثلا اونجا مه tx رو از textbox نمونه سازی کرده زیرش می تونی بنویسی tx.text ="mohammad"
منتها شما بجای خاصیت تکستی که من نوشتم می تونی برای استایلش این کار رو انجام بدی

ramin149
یک شنبه 06 شهریور 1390, 13:05 عصر
دوست عزیز این رو می دونم ولی در مورد کدی که من گذاشتم در مورد LiteralControl فرق داره این کنترل همونجا ساخته شده و هیچ نوع اسمی به کار نرفته در خط پایین به چه شکلی باید صدا بزنم و خاصیت استایلش رو بهش ست کنم ؟

dontspeak
یک شنبه 06 شهریور 1390, 14:17 عصر
protected void Page_Load(object sender, EventArgs e)
{

Table table = new Table();
TableRow row;
TableCell cell;
for (int i = 0; i < 10; i++)
{
row = new TableRow();
cell = new TableCell();
cell.Controls.Add(new LiteralControl(string.Format("Caption {0} : ", i)));
row.Cells.Add(cell);
TextBox txt = new TextBox();
txt.ID = string.Format("Mami{0}", i);
cell = new TableCell();
cell.Controls.Add(txt);
row.Cells.Add(cell);
table.Rows.Add(row);
}
PlaceHolder1.Controls.Add(table);


var tx = Page.FindControl("mami1") as TextBox;
tx.Text = "Your message here";
}
این کدو ببین. من بهش یه آی دی دادم و طبق اون آی دی یکیشونو فراخوندم و text اونو عوض کردم. در مورد اون کدی که شما میگید هم زیاد فرقی نداره بازم من نمونه اونو توی همون کد خودم گذاشتم. شما فقط باید موقع ساختن این کنترلها یه آی دی به اونها بدین. همین

ramin149
یک شنبه 06 شهریور 1390, 16:41 عصر
خیلی ممنون حواسم به ای دی دادن کد ها نبود . اگر به مشکلی برخورد گردم در همین صفحه می پرسم . فعلا جواب سوال هایمرو گرفتم . :بوس:

ramin149
دوشنبه 07 شهریور 1390, 20:08 عصر
من با کدی که در این پست گذاشید توانستم کنترل های مورد نظرم را به صفحه اضافه کنم . حالا به چه صورت می توانم به کنترل ها فرمان بدم . مثلا من داخل صفحه ام یک مبلغ کل دارم . و در حلقه یک Checkbox و یک لیبل قرار دادم که داخل لیبل مبلغی نوشته شده و قتی که کاربر روی چک باکس کلید کنه می خواهم مبلغ لیبل مال پک باکس جمع شود با مبلغ کل .؟؟؟
یک فایل برای مثال بالا گذاشتم برای راحتی بچه ها .:خجالت:

dontspeak
دوشنبه 07 شهریور 1390, 21:24 عصر
رامین جان سلام
findcontrol کن و کنترل چک باکستو پیدا کن بعد مقدار text اونو به int تبدیل کن و با رقم مورد نظر جمع بزن. اگه با هرکدوم از این قسمتها مشکل داشتی بگو تا من کمکت کنم:چشمک:

ramin149
سه شنبه 08 شهریور 1390, 01:15 صبح
دوست عزیز مشکل من روی findcontrol . من نمی دونم چه چیزی بنویسم که وقتی روی checkbox شماره 2 کلید می کنم متن لیبل شماره 2 را بگیرم و عملیتات مورد نیازم را انجام بدم . بقیه کار ها و تبدیل کنترل ها را بلدم و لازم به توضیح نیست

dontspeak
سه شنبه 08 شهریور 1390, 12:42 عصر
توی اون کد اولی که برات گذاشتم نگاه کن. من به هر کنترل یک id دادم. شما هم باید به هر checkbox یه id بدی بعد اونو فراخونی کنی. دقیقا مثل کدی که برات گذاشتم. یه دور به اون قشنگ دقت کن ببین چطوری هست

ramin149
سه شنبه 08 شهریور 1390, 15:17 عصر
دوست عزیز مثال شما مال page load در صورتی که من کدی که می خوام بنویسم بعد از page load . من یک سری checkbox در صفحه گذاشتم مانند کد شما . این چک باکس ها برای هزینه ناهار که اگر طرف برای هر روز ناهار بخواد روی آن checkbox کلید کنه . و مبلغ ناهار به قیمت کل اضافه بشه . مشکل اصلی اینجاست که وقتی صفحه بالا آمد برای چک باکس ها چه کدی بنویسم که وقتی کاربر روی آنها کلید گرد فقط قیمت لیبل روبروی چک باکس اضافه بشه به قیمت کل .

ramin149
چهارشنبه 09 شهریور 1390, 10:53 صبح
لطفا یکی کمک کنه

arian_sh3
چهارشنبه 09 شهریور 1390, 13:01 عصر
سلام.
دوست عزیزم مطمئن نیستم درست متوجه شده باشم. اما اگر درست فهمیده باشم میتونی مشکل رو اینجوری حل کنی:
متغیر هائی مثل مبلغ کل و این هارو که تعریف شده فرض میکنم.

for (i=0;i<=n;i++){
if( ch[i].checked==true){
total +=ch[i].text;}
}

اگر کنترل هاتو اینجوری تعریف کرده باشی که مثلا همه اولشون ch باشه و یه عددی بهشون اضافه بشه میتونی اینکارو بکنی.
اگر اشتباه فهمیدم یا مشکلی هست بهم بگو شاید بتونم کمک کنم.

arian_sh3
چهارشنبه 09 شهریور 1390, 13:22 عصر
ببخشید کدی که نوشتم ناقص بود.




for (int i = 0; i <= table.RowCount - 1; i++)
{
string a;
if (table.Rows[i].Cells["CheckBox"].Checked==true)
{
a = table.Rows[i].Cells["CheckBox"].Value.ToString();
}
}

ramin149
جمعه 11 شهریور 1390, 02:10 صبح
خیلی ممنون بابت کد شما . من هنوز کد شما را امتحان نکردم اما ببه نظرم من سالم و درست است . یک سوال دیگه این کد در Button نوشته می شه و کار می کنه . اگر من بخوام کاربر همان لحظه که روی چک باکس کلید گرد تغییرت لازم انجام شود باید چه کدی بنویسم ؟

ramin149
شنبه 12 شهریور 1390, 11:31 صبح
کسی نیست جواب سوال من رو بده

ramin149
سه شنبه 15 شهریور 1390, 15:13 عصر
لطف کمک کنید .
من یک فرم پویا داخل یک پنل درست گردم و به تمام المنت ها id دادم (این کار در page load ) انجام شد . بعد از اینکه کاربر متنی را در تکس باکس می نویسه ، در پایین صفحه یک دکمه قرار دادم که مقدار تکس باکس ریخته می شه در یک دیتاتیبل . اما با خطا مواجه می شم .
کد داخل Button

for (int i = 0; i < CountRoom; i++)
{
var tx = pnl_InsertName.FindControl("txt_InsertName"+i) as TextBox;
dt.Rows[i]["Type"] = tx.Text;
}

متن خطا
System.NullReferenceException: Object reference not set to an instance of an object.

arian_sh3
پنج شنبه 17 شهریور 1390, 21:03 عصر
ببخشید بابت تاخیر.
در مورد چک باکس کد رو درون یک handler که با تغییر مقدار چک باکس فراخوانی میشه باید بنویسید و خصوصیت auto postback چک باکس رو true قرار بدید.

در مورد مشکل اتصال به دیتا بیستون ممکنه مشکلات زیادی باشه سعی کنید با نشانه گذازی زمان کامپایل مشکل رو حل کنید اما معمولا زمانی این اتفاق می افته که شما فیلد دیتا بیس رو طوری تنظیم کردید که مقدار null نپذیره و یا... ممکنه اسم کنتری هم که قرار دادید رو نتونسته پیدا کنه به همین دلیل متغیر دیتا بیس مقدار دهی نمیشه

A.S.Roma
یک شنبه 27 شهریور 1390, 15:10 عصر
دوست من تا می تونید از کنترل هایی مثل ListView و Repeater‌و ... استفاده کنید.

Value گرفتن از کنترل های Dynamic ی که در Page_load تولید میشن به این سادگی نیست !!

اگر مصرید که حتما" از این روش استفاده کنید اعلام کنید تا راهنمایی کنم.

Mohandes2009
دوشنبه 28 شهریور 1390, 08:22 صبح
سلام من یه Button گزاشتم و براش کد زیر را نوشتم که تولید لیبل و تکست باکس کنه بعد در دکمه سیو خودم کد نوشتم که یکی یکی تکس باکس ها را در هر سطر جدول ذخیره کنه اما ذخیره نمیکنه میشه یکیبگه چرا دلیلش چیه؟




public static int i = 0;

protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
return;
}


protected void ImageButton1_Click(object sender, ImageClickEventArgs e)
{
ADDTextBox(i);
++i;
}

private void ADDTextBox(int a )
{
if (IsPostBack)
{
Table table = new Table();
TableRow row;
TableCell cell;
for (int i = 0; i <= a; i++)
{
row = new TableRow();
cell = new TableCell();
Label lbl = new Label();
lbl.Text = "گزینه " + (i + 1).ToString() + " : ";
cell = new TableCell();
row.Cells.Add(cell);
cell.Controls.Add(lbl);
TextBox txt = new TextBox();
txt.ID = (i).ToString();
cell = new TableCell();
cell.Controls.Add(txt);
row.Cells.Add(cell);
table.Rows.Add(row);
Panel1.Controls.Add(table);
}

}
}


protected void btnAdd_Click(object sender, EventArgs e)
{
try
{
if (IsPostBack)
{
int q = (from c in linq.TQNazarsanjis
where c.Titr == txtQusetion.Text
select c.Id).First();

for (int j = 1; j <= i; j++)
{
TextBox txt = new TextBox();
txt.Text = ((TextBox)Panel1.FindControl((j).ToString())).Text ;

if (txt.Text != "" || txt.Text != null)
{
TGNazarsanji AddG = new TGNazarsanji();
AddG.Id_Nazarsanji = q;
AddG.Gozine = txt.Text;
linq.TGNazarsanjis.InsertOnSubmit(AddG);
linq.SubmitChanges();
}
}
pSuccess.Visible = true;
}
}
catch
{
pFail.Visible = true;
}
}

A.S.Roma
دوشنبه 28 شهریور 1390, 09:30 صبح
شما تو یک ایونت میاید یک سری کنترل رو رو صفحه قرار میدید.
اما Life Cycle صفحات asp.net چرخه ای طولانی تر داره از preInit تا LoadCompleted‌. سرور ASP.NET‌از کجا بفهمه که شما چه کنترل هایی رو به صورتی دستی به صفحه اضافه کردید !؟

می تونید نام کنترل ها رو در یک List ذخیره کنید سپس ایونت LoadViewState رو override کنید و خودتون مجدد کنترل های دینامیک رو به صفحه اضافه کنید.

یک نمونه ساده :

List<string> dynamicIDs = null;

protected override void LoadViewState(object savedState)
{
base.LoadViewState(savedState);
dynamicIDs = (List<string>)ViewState["dynamicControls"];
foreach (string item in dynamicIDs)
{
TextBox txt = new TextBox();
txt.ID = item;
form1.Controls.Add(txt);
}
}

protected void Page_Load(object sender, EventArgs e)
{

}

protected void btnShow_Click(object sender, EventArgs e)
{
for (int i = 0; i < 2; i++)
{
TextBox txt = (TextBox)form1.FindControl("txtTest" + i.ToString());
Response.Write(txt.Text);
}

}

protected void btnInsertTxt_Click(object sender, EventArgs e)
{
if (dynamicIDs == null)
dynamicIDs = new List<string>();
for (int i = 0; i < 2; i++)
{
TextBox txt = new TextBox();
txt.ID = "txtTest" + i.ToString();
dynamicIDs.Add(txt.ID);
form1.Controls.Add(txt);
}
ViewState["dynamicControls"] = dynamicIDs;
}

Mohandes2009
سه شنبه 29 شهریور 1390, 16:52 عصر
هیچی نفهمیدم از کدات میشه توضیح بدی و واضح تر بگی؟:متفکر:

raziee
چهارشنبه 30 شهریور 1390, 10:04 صبح
هیچی نفهمیدم از کدات میشه توضیح بدی و واضح تر بگی؟
به زبان ساده:
شما زمانی که کنترلی در زمان اجرا به صفحه اضافه میکنید مثل تمامی کنترل های دیگه دارای ViewState هست تا بتونه وضعیت خودش رو حفظ کنه.
خوب در زمان ایجاد یک کنترل و همینطور رندر شدن صفحه و ارسال به کلاینت مشکلی نیست.
مشکل زمانی پیش میاد که بخواهیم بعد از ارسال صفحه از کلاینت به سرور(صفحه ای که دارای کنترل هایی هست که در RunTime ایجاد شده است) وضعیت کنترل هایی که در زمان اجرا به صفحه اضافه شدن نا مشخص هست. یعنی درواقع به صورت پیشفرض ViewState های مربوط به اون کنترل ها بررسی نمیشه!!! و باید مجبورش کنیم تا این ViewState اه رو هم بررسی کنه! متد LoadViewState وظیفه بررسی ViewSate های صفحه ی ارسال شده از کلاینت به سرور رو داره که در کد مذکور override شده.