View Full Version : سوال: چطوری مقادیری که در Gridview وارد میشه رو حتی پس از عمل PostBack صفحه میشه حفظ کرد؟
behzad1367
شنبه 02 مهر 1390, 08:46 صبح
سلام.من تعدادی Gridview دارم که برای تکست باکس های داخلشون رویداد Keyup تعیین کردم.به طوری که پس از اینکه روی این تکست باکس ها کلیدی فشرده میشه یه سطر خالی به انتهای اون GridView اضافه میشه.اما من میخام همزمان با این عمل جمع کل سطر های مثلا ستون "میزان ارایه" رو داخل یه تکست باکس داخل فوتر Gridview بریزم.اما مشکل اینه که به خاطر اینکه پس از رویداد keyup صفحه postback میشه مقادیری رو که کاربر داخل گرید ویو وارد کرده پاک میشه.
احتمالا شما استفاده از datatable و session رو پیشنهاد میدید.اما اگه قرار باشه با تایپ هر حرفی در تکست باکس مقدار گرید داخل session ذخیره بشه که خیلی خیلی حجم محاسبات بالا میره.
به راه دیگه که خودم امتحان کردم این بود که جمع سطر ها رو با جاوا اسکریپت انجام دادم.اما بازم مشکل اینه که وقتی بر اثر رویداد keyup صفحه postback میشه مقادیر گرید هم از دست میره و تابع جاوا اسکریپتم کاری نمیتونه بکنه.
اینم عکس گرید ویو:
http://up6.iranblog.com/images/qah59we1ktz07ljz56x.jpg
به نظر شما آیا با استفاده از روش آژاکس را بدون آژاکس تجربه کنید میشه ان کار رو انجام داد؟
اساتید عزیز اگه کمکی ازتون بر میاد کمک کنید تا 10 روز دیگه پروژه پایان دورمو باید تحویل بدم.ممنون
hjran abdpor
شنبه 02 مهر 1390, 12:24 عصر
سلام.من تعدادی Gridview دارم که برای تکست باکس های داخلشون رویداد Keyup تعیین کردم.به طوری که پس از اینکه روی این تکست باکس ها کلیدی فشرده میشه یه سطر خالی به انتهای اون GridView اضافه میشه.اما من میخام همزمان با این عمل جمع کل سطر های مثلا ستون "میزان ارایه" رو داخل یه تکست باکس داخل فوتر Gridview بریزم.اما مشکل اینه که به خاطر اینکه پس از رویداد keyup صفحه postback میشه مقادیری رو که کاربر داخل گرید ویو وارد کرده پاک میشه.
احتمالا شما استفاده از datatable و session رو پیشنهاد میدید.اما اگه قرار باشه با تایپ هر حرفی در تکست باکس مقدار گرید داخل session ذخیره بشه که خیلی خیلی حجم محاسبات بالا میره.
به راه دیگه که خودم امتحان کردم این بود که جمع سطر ها رو با جاوا اسکریپت انجام دادم.اما بازم مشکل اینه که وقتی بر اثر رویداد keyup صفحه postback میشه مقادیر گرید هم از دست میره و تابع جاوا اسکریپتم کاری نمیتونه بکنه.
اینم عکس گرید ویو:
http://up6.iranblog.com/images/qah59we1ktz07ljz56x.jpg
به نظر شما آیا با استفاده از روش آژاکس را بدون آژاکس تجربه کنید میشه ان کار رو انجام داد؟
اساتید عزیز اگه کمکی ازتون بر میاد کمک کنید تا 10 روز دیگه پروژه پایان دورمو باید تحویل بدم.ممنون
با سلام.
شما باید از State Mengment استفاده نمایید. سرچ کنید تو سات.
behzad1367
شنبه 02 مهر 1390, 13:24 عصر
با سلام.
شما باید از State Mengment استفاده نمایید. سرچ کنید تو سات.
ممنون.فکر نمی کنم state management کمکی کنه.چون اینم دقیقا عین Session میمونه و باعث میشه پردازش بالا بره.
behzad1367
شنبه 02 مهر 1390, 13:26 عصر
آیا میشه مقادیری که کاربر در گرید وارد میکنه رو بدون ذخیره در جایی مثل DataTable و یا Session پس از Postback هم داشت؟
hjran abdpor
شنبه 02 مهر 1390, 13:34 عصر
سشن بستگی به تعدادکاربران بازدید کننده داره، اگه سایت شما تعداد کاربرانش زیاد است استاده نکیند !!!!!!!!!!!!!!!!!!!!!!
برا سوال دومتون هم اگه جاوااسکریپت یا اجاکس بلدید استفاده کنید.
دقیقا نمیدونم .
behzad1367
شنبه 02 مهر 1390, 14:21 عصر
سشن بستگی به تعدادکاربران بازدید کننده داره، اگه سایت شما تعداد کاربرانش زیاد است استاده نکیند !!!!!!!!!!!!!!!!!!!!!!
برا سوال دومتون هم اگه جاوااسکریپت یا اجاکس بلدید استفاده کنید.
دقیقا نمیدونم .
شما حساب کن 15 تا گرید ویو دارم رو صفحه اگه قرار باشه با هر رویداد keyup که اتفاق میفته کل تکست باکس های اون گرید ویو داخل سشن یا datatable ذخیره بشن که خیلی سرعت میاد پایین.
و اما در رابطه با استفاده از جاوا اسکریپت.من از جاوا اسکریپت و جی کویری برای محاسبه جمع سطر ها و ستون ها استفاده کردم به این صورت:
$(document).ready(function () {
$("input").keyup(function () {
d = 0;
c = 0;
res = 0;
tableName = $(this).attr('id');
tableName = "" + tableName;
tableName = tableName.split("_");
tableName = tableName[2];
d = 0;
c = 0;
for (i = 0; i < $("input[id*='" + n.toString() + "']").length; i++) {
if ($("input[id*='ContentPlaceHolder1_Wizard2_'" + tableName + "'_Rels_'" + tableName + "'_Text']").eq(i).val() == "") {
$("input[id*='ContentPlaceHolder1_Wizard2_'" + tableName + "'_Rels_'" + tableName + "'_Text']").eq(i).val(0);
d = 0;
}
if ($("input[id*='ContentPlaceHolder1_Wizard2_'" + tableName + "'_Unit_'" + tableName + "'_Text']").eq(i).val() == "") {
$("input[id*='ContentPlaceHolder1_Wizard2_'" + tableName + "'_Unit_'" + tableName + "'_Text']").eq(i).val(0);
c = 0;
}
var d = parseInt($("input[id*='Rels_'" + tableName + "'_Text']").eq(i).val());
var c = parseInt($("input[id*='Unit_'" + tableName + "'_Text']").eq(i).val());
var res = 0;
res = d + c;
$("input[id*='ContentPlaceHolder1_Wizard2_'" + tableName + "'_Total_'" + tableName + "'_Text']").eq(i).val(res);
}
var foot3 = parseInt(0);
var foot2 = parseInt(0);
var foot1 = parseInt(0);
for (i = 0; i < $("input[id*='ContentPlaceHolder1_Wizard2_TblIncomes_Rels_T blIncomes_Text']").length; i++) {
foot1 = parseInt(foot1) + parseInt($("input[id*='ContentPlaceHolder1_Wizard2_TblIncomes_Rels_T blIncomes_Text']").eq(i).val());
foot2 = parseInt(foot2) + parseInt($("input[id*='ContentPlaceHolder1_Wizard2_TblIncomes_Unit_T blIncomes_Text']").eq(i).val());
foot3 = parseInt(foot3) + parseInt($("input[id*='ContentPlaceHolder1_Wizard2_TblIncomes_Total_ TblIncomes_Text']").eq(i).val());
}
$("input[id*='F_Rels_TblIncomes_Text']").val(parseInt(foot1));
$("input[id*='F_Unit_TblIncomes_Text']").val(parseInt(foot2));
$("input[id*='F_Total_TblIncomes_Text']").val(parseInt(foot3));
});
خب با این قطعه کد هر وقت که در تکست باکس های Gridview رویداد keyup اتفاق می افته جمع همه سطر ها وستون ها انجام میشه.اما مساله اینجاست که من در Code Behind هم واسه تکست باکس های GridView هم رویداد Keyup تعریف کردم که هروقت اتفاق افتاد یه سطر خالی به انتهای Gridview اضافه کنه.و متاسفانه وقتی این رویداد اتفاق می افته چون صفحه postback میشه دیگه تابع جاوا اسکریپت که وظیفه انجام محاسبات رو در GridView داره کاری انجام نمیده.
دوستان کسی هست بتونه این مشکلو حل کنه؟
behzad1367
شنبه 02 مهر 1390, 18:04 عصر
آیا میشه کاری کرد که تابع جاوا اسکریپت پس از PageLoad اتفاق بیفته؟
behzad1367
یک شنبه 03 مهر 1390, 07:35 صبح
آیا میشه کاری کرد که تابع جاوا اسکریپت پس از PageLoad اتفاق بیفته؟
دوستان لطف کنن هر نظری دارن بگن.پروژم تو این قسمت گیر کرده
behzad1367
یک شنبه 03 مهر 1390, 13:07 عصر
این مشکلو تا حالا کسی نداشته؟؟:گریه:
A.S.Roma
یک شنبه 03 مهر 1390, 13:36 عصر
اگر کدهای JavaScript اینجا بنویسی در هر بار Loadصفحه اجرا میشن :
<script for="window" event="onload">
</script>
در IE مطمئنا" کار می کنه اما مرورگرهای دیگرو نمی دونم .
behzad1367
یک شنبه 03 مهر 1390, 14:00 عصر
اگر کدهای JavaScript اینجا بنویسی در هر بار Loadصفحه اجرا میشن :
<script for="window" event="onload">
</script>
در IE مطمئنا" کار می کنه اما مرورگرهای دیگرو نمی دونم .
داداش شما ظاهرا منظور منو متوجه نشدی.این کدی که نوشتی درست اما مشکل من تداخل رویدا های keyup جاوااسکریپت و keyup بخش code behind هستش.به این صورت که وقتی که key up سمت سرور اتفاق میفته به دلیل اینکه پست بک رخ میده دیگه تابع Keyyp جاوا اسکریپتم کار نمیکنه!
دوستان راهنمایی کنن
A.S.Roma
یک شنبه 03 مهر 1390, 14:05 عصر
داداش شما ظاهرا منظور منو متوجه نشدی.این کدی که نوشتی درست اما مشکل من تداخل رویدا های keyup جاوااسکریپت و keyup بخش code behind هستش.به این صورت که وقتی که key up سمت سرور اتفاق میفته به دلیل اینکه پست بک رخ میده دیگه تابع Keyyp جاوا اسکریپتم کار نمیکنه!
دوستان راهنمایی کنن
این پست شما نیست !؟
آیا میشه کاری کرد که تابع جاوا اسکریپت پس از PageLoad اتفاق بیفته؟
دوستان لطف کنن هر نظری دارن بگن.پروژم تو این قسمت گیر کرده
A.S.Roma
یک شنبه 03 مهر 1390, 14:13 عصر
for(var i=1;i<tableRowCount;i++)
{
var ctrl = getTheRightControl(table);
ctr.fireEvent("onkeyup");
}
behzad1367
یک شنبه 03 مهر 1390, 17:57 عصر
for(var i=1;i<tableRowCount;i++)
{
var ctrl = getTheRightControl(table);
ctr.fireEvent("onkeyup");
}
داداش میگی این قطعه کدی که گذاشتی چی کار میکنه؟
behzad1367
یک شنبه 03 مهر 1390, 20:08 عصر
آقا کسی میدونه قطعه کدی که دوستمون بالا گذاشتن چی کار میکنه؟
A.S.Roma
دوشنبه 04 مهر 1390, 09:42 صبح
مشکل شما اینه که یکسری عملیات بر روی یک ایونت خاص سمت کلاینت انجام میدید که با PostBackاز بین میرن .
بایستی یک for روی تمامی سطرهای جدول (Grid) بزنید (سمت کلاینت) و در هر سطر به کنترل textBox مورد نظرتون برسید و خودتون دستی باعث فایر شدن ایونت onchange یا onkeyup یا ... بشید.
کدی که من نوشتم عملا" کار نمی کنه چون بایستی tableRowCount و getTheRightControl رو خودتون پیاده سازی کنید.
behzad1367
دوشنبه 04 مهر 1390, 11:29 صبح
آقا کسی میدونه قطعه کدی که دوستمون بالا گذاشتن چی کار میکنه؟
داداش مرسی که جواب دادی.
tableRowCount رو بلدم.اما نمیدونم منظورت از getTheRightControl چیه؟
در ضمن یعنی اگه به خاطر رویداد keyup سمت Code Behind صفحه postback بشه بازم این فایر کردن تابع keyup جواب میده؟
چون من حتما برای اضافه کردن سطر به گرید ویو میخام از keyup سمت سرور استفاده کنم.اما برای محاسبه جمع ستون ها از keyyp سمت کلاینت
A.S.Roma
دوشنبه 04 مهر 1390, 12:04 عصر
داداش مرسی که جواب دادی.
tableRowCount رو بلدم.اما نمیدونم منظورت از getTheRightControl چیه؟
در ضمن یعنی اگه به خاطر رویداد keyup سمت Code Behind صفحه postback بشه بازم این فایر کردن تابع keyup جواب میده؟
چون من حتما برای اضافه کردن سطر به گرید ویو میخام از keyup سمت سرور استفاده کنم.اما برای محاسبه جمع ستون ها از keyyp سمت کلاینت
الان که تاپیک رو دوباره خوندم، برای کار شما نیاز به این کارا نیست .
سعی کن معادل این کد رو با شرایط صفحه ات در انتهای صفحه بنویس .
var sum1 = 0;
var sum2 = 0;
var lastIndex = tbl.rows.length;
for (var i = 1; i < tbl.rows.length - 1; i++) {
sum1 += parseInt(tbl.rows(i).children(1).value);
sum2 += parseInt(tbl.rows(i).children(1).value);
}
tbl.rows(lastIndex).children(1).value = sum1;
tbl.rows(lastIndex).children(2).value = sum2;
behzad1367
دوشنبه 04 مهر 1390, 14:16 عصر
الان که تاپیک رو دوباره خوندم، برای کار شما نیاز به این کارا نیست .
سعی کن معادل این کد رو با شرایط صفحه ات در انتهای صفحه بنویس .
var sum1 = 0;
var sum2 = 0;
var lastIndex = tbl.rows.length;
for (var i = 1; i < tbl.rows.length - 1; i++) {
sum1 += parseInt(tbl.rows(i).children(1).value);
sum2 += parseInt(tbl.rows(i).children(1).value);
}
tbl.rows(lastIndex).children(1).value = sum1;
tbl.rows(lastIndex).children(2).value = sum2;
داداش ممنون از جوابت.ولی فکر میکنم جواب بده چون وقتی postback انجام میشه این اجرا نمیشه.و این که منظور از این که گفتی این کد رو در انتهای صفحه بنویسم یعنی چی؟ کد های جاوا اسکریپت که همه بالای صفحات نوشته میشه معمولا
A.S.Roma
دوشنبه 04 مهر 1390, 14:47 عصر
نه دوست من ؛
نیازی نیست همیشه بالای صفحه نوشت.
این خطوط رو ( بعد از ایجاد تغییرات لازم ) در انتهای صفحه میان دو تگ <script> بنویسید. ( مسلما" میان تگ html )
اوبالیت به بو
دوشنبه 04 مهر 1390, 15:04 عصر
اما مشکل اینه که به خاطر اینکه پس از رویداد keyup صفحه postback (http://en.wikipedia.org/wiki/Postback) میشه مقادیری رو که کاربر داخل گرید ویو وارد کرده پاک میشه.
سلام
چرا باید پاک بشه؟ ممکنه شما دستورات داخل Page_Load رو اینجا قرار بدید؟ اگر ViewState فعال باشه نباید پاک بشه.
behzad1367
دوشنبه 04 مهر 1390, 17:29 عصر
سلام
چرا باید پاک بشه؟ ممکنه شما دستورات داخل Page_Load رو اینجا قرار بدید؟ اگر ViewState فعال باشه نباید پاک بشه.
اینم قطعه کد بنده:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
select();
}
بلاک زیر مربوط به تابع جاوا اسکریپتم هست که در اون اسم گرید ویو که TblIncomes هست رو به صفحه پاس دادم.این تابع جاوا اسکریپت زمانی که رویداد کی آپ در گرید ویو رخ میده اجرا میشه.
if (Request["__EVENTTARGET"] == "TblIncomes")
{
add((DataTable)Session["Grid"]);
}
TblIncomes.DataSource=(DataTable)Session["Grid"];
if (Request["__EVENTTARGET"] == "TblIncomes")
{
add((DataTable)Session["Grid"]);
for (int i = 0; i < TblIncomes.Rows.Count-1; i++)
{
DataTable TblIncom = (DataTable) Session["Grid"];
int offer=Convert.ToInt32(TblIncom.Rows[i][2]);
int unit = Convert.ToInt32(TblIncom.Rows[i][3]);
TblIncom.Rows[i][4] =(offer*unit).ToString();
Session["Grid"] = TblIncom;
}
}
}
public void add(DataTable Tbl)
{
DataRow newRow = Tbl.NewRow();
Tbl.Rows.Add(newRow);
TblIncomes.DataSource = Tbl;
TblIncomes.DataBind();
Session["Grid"] = Tbl;
}
protected void ImageButton2_Click(object sender, ImageClickEventArgs e)
{
// Table INCOMES//
try
{
DataAccess select = new DataAccess();
int ID=Convert.ToInt32(Session["PlanID"]);
SqlParameter[] param = new SqlParameter[5];
for (int i = 0; i < TblIncomes.Rows.Count; i++)
{
TextBox a = (TextBox)TblIncomes.Rows[i].FindControl("TextBox165");
TextBox b = (TextBox)TblIncomes.Rows[i].FindControl("TextBox168");
TextBox c = (TextBox)TblIncomes.Rows[i].FindControl("TextBox170");
TextBox d = (TextBox)TblIncomes.Rows[i].FindControl("TextBox173");
if (Visible)
{
string query2 = "Insert Into [Tbl-Incomes]([Title],[Count],[Unit-Cost],[Total-Cost],[Plan-ID]) Values('" + a.Text + "','" + b.Text + "','" + c.Text + "','" + d.Text + "','"+ID+"') ";
select.Docommand(query2);
}
}
add((DataTable)Session["Grid"]);
}
catch (Exception)
{
return;
}
}
public void select()
{
try
{
Session["PlanID"] = 1;
DataAccess select = new DataAccess();
string query = @"SELECT * From [Tbl-Incomes] Where [Plan-ID]='" + Session["PlanID"] + "'";
Table = select.Select(query);
if (Table.Rows.Count > 0)
{
TblIncomes.DataSource = Table;
TblIncomes.DataBind();
Response.Write(TblIncomes.Rows[0].Cells[0].Text);
Session["Grid"] = TblIncomes.DataSource;
add((DataTable)Session["Grid"]);
}
else
{
Table.Columns.Add("ردیف", typeof(string));
Table.Columns.Add("نام محصول / خدمت", typeof(string));
Table.Columns.Add("میزان ارایه /تولید", typeof(string));
Table.Columns.Add("قیمت فروش یک محصول", typeof(string));
Table.Columns.Add("قیمت کل فروش( ریال )", typeof(string));
row = Table.NewRow();
row["ردیف"] = string.Empty;
row["نام محصول / خدمت"] = string.Empty;
row["میزان ارایه /تولید"] = string.Empty;
row["قیمت فروش یک محصول"] = string.Empty;
row["قیمت کل فروش( ریال )"] = string.Empty;
TblIncomes.DataSource = Table;
TblIncomes.DataBind();
Session["Grid"] = Table;
}
}
catch (Exception)
{
Response.Write("Error 404");
}
}
protected void TblIncomes_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "remove")
{
string title = (e.CommandArgument).ToString();
try
{
string query = @"delete from [Tbl-Incomes] where[Title]=N'" + title + "'";
DataAccess DATA = new DataAccess();
DATA.Docommand(query);
}
catch
{
Response.Write("there is problem with delete");
}
}
}
protected void btnInfo_Click(object sender, EventArgs e)
{
}
}
یعنی شما میگی که اگه ViewState گرید ویو فعال باشه اگه هر مقداری داخل تکست باکس های داخل گرید ویو وارد بشه و صفحه دوباره load بشه اون مقادیر پاک نمیشن؟
اوبالیت به بو
دوشنبه 04 مهر 1390, 22:15 عصر
سلام
دلیل اینکه این کد رو:
بلاک زیر مربوط به تابع جاوا اسکریپتم هست که در اون اسم گرید ویو که TblIncomes هست رو به صفحه پاس دادم.این تابع جاوا اسکریپت زمانی که رویداد کی آپ در گرید ویو رخ میده اجرا میشه.
if (Request["__EVENTTARGET"] == "TblIncomes")
{
add((DataTable)Session["Grid"]);
}
TblIncomes.DataSource=(DataTable)Session["Grid"];
if (Request["__EVENTTARGET"] == "TblIncomes")
{
add((DataTable)Session["Grid"]);
for (int i = 0; i < TblIncomes.Rows.Count-1; i++)
{
DataTable TblIncom = (DataTable) Session["Grid"];
int offer=Convert.ToInt32(TblIncom.Rows[i][2]);
int unit = Convert.ToInt32(TblIncom.Rows[i][3]);
TblIncom.Rows[i][4] =(offer*unit).ToString();
Session["Grid"] = TblIncom;
}
}
خارج بلاک if(!IsPostBack) نوشتید چی هست؟ داخل بنویسید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.