PDA

View Full Version : سوال: چرا hiddenfield ها در component مقدارشان در postback از بین می رود ؟؟



F_Javan
شنبه 20 مهر 1387, 09:03 صبح
از طریق کلاس زیر می توان ردیف های Gridview را بدون postback با javascript انتخاب کرد.
ولی مشکلش این هست که توی post back ها مقدار hidden field ها از بین میرود.
لطفا مشکل کد من را بگویید.

using System;
using System.Data;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Linq;
using System.Drawing;
using System.Design;
namespace WebControls
{
[DefaultProperty("CurrentValue")]
[ToolboxData("<{0}:TestGrid runat=server></{0}:TestGrid>")]
[ToolboxBitmap(typeof(WebControls.TestGrid), "TestGrid.TestGrid.ico")]


publicclassTestGrid1 : System.Web.UI.WebControls.GridView
{
private System.Web.UI.WebControls.HiddenField hdnFieldGridCount ;
private System.Web.UI.WebControls.HiddenField hdnFieldSelectedRow;
private System.Web.UI.WebControls.HiddenField hdnFieldSelectedID;
private System.Web.UI.WebControls.HiddenField hdnFieldSelectedTitle ;

public TestGrid1()
{
hdnFieldGridCount = newHiddenField();
hdnFieldSelectedRow = newHiddenField();
hdnFieldSelectedID = newHiddenField();
hdnFieldSelectedTitle = newHiddenField();

hdnFieldGridCount.ID = "hdnFieldGridCount_" + ID;
hdnFieldSelectedRow.ID = "hdnFieldSelectedRow_" + ID;
hdnFieldSelectedID.ID = "hdnFieldSelectedID_" + ID;
hdnFieldSelectedTitle.ID = "hdnFieldSelectedTitle_" + ID;
base.RowDataBound += newGridViewRowEventHandler(TestGrid_RowDataBound);
base.DataBound += newEventHandler(TestGrid_DataBound);

}
void TestGrid_DataBound(object sender, EventArgs e)
{
hdnFieldGridCount.Value = base.Rows.Count.ToString();
}
protectedoverridevoid RenderContents(HtmlTextWriter writer)
{
this.hdnFieldGridCount.RenderControl(writer);
this.hdnFieldSelectedRow.RenderControl(writer);
this.hdnFieldSelectedID.RenderControl(writer);
this.hdnFieldSelectedTitle.RenderControl(writer);
base.RenderContents(writer);
}
void TestGrid_RowDataBound(object sender, GridViewRowEventArgs e)
{
string strAlternateRowBackColor = string.Empty;
string strRowBackColor = string.Empty;
string strSelectedColor = string.Empty;
try
{

if (base.SelectedRowStyle.BackColor.Name.Substring(0, 2) != "ff")
strSelectedColor = base.SelectedRowStyle.BackColor.Name;
else
strSelectedColor = "#" + base.SelectedRowStyle.BackColor.Name.Remove(0, 2);
if (e.Row.RowType == DataControlRowType.DataRow)
{
if (base.AlternatingRowStyle.BackColor.Name.Substring (0, 2) != "ff")
strAlternateRowBackColor = base.AlternatingRowStyle.BackColor.Name;
else
strAlternateRowBackColor = "#" + base.AlternatingRowStyle.BackColor.Name.Remove(0, 2);
if (base.RowStyle.BackColor.Name.Substring(0, 2) != "ff")
strRowBackColor = base.RowStyle.BackColor.Name;
else
strRowBackColor = "#" + base.RowStyle.BackColor.Name.Remove(0, 2);
}
}
catch (Exception)
{

}
try
{
System.Web.UI.WebControls.Label lblID = (System.Web.UI.WebControls.Label)e.Row.FindControl ("lblID");
System.Web.UI.WebControls.Label lblName = (System.Web.UI.WebControls.Label)e.Row.FindControl ("lblName");
e.Row.Attributes.Add("onclick", "GetOriginalColor('" + strAlternateRowBackColor + "','" + strRowBackColor + "');javascrit:return GetSelectedRecord('" + e.Row.RowIndex + "','" + lblID.Text + "','" + lblName.Text + "','" + strSelectedColor + "',document.getElementById('" + base.ClientID + "'),'" + hdnFieldGridCount.ClientID + "','" + hdnFieldSelectedRow.ClientID + "','" + hdnFieldSelectedID.ClientID + "','" + hdnFieldSelectedTitle.ClientID + "')");
e.Row.Attributes.Add("style", "cursor : pointer");
}
catch (Exception)
{
}
}
publicoverridestring ID
{
get
{
returnbase.ID;
}
set
{
base.ID = value;
hdnFieldGridCount.ID = "hdnFieldGridCount_" + ID;
hdnFieldSelectedRow.ID = "hdnFieldSelectedRow_" + ID;
hdnFieldSelectedID.ID = "hdnFieldSelectedID_" + ID;
hdnFieldSelectedTitle.ID = "hdnFieldSelectedTitle_" + ID;
}
}
publicstring GetGridCount
{
get { return hdnFieldGridCount.Value; }
}
publicstring GetSelectedRow
{
get { return hdnFieldSelectedRow.Value; }
}
publicstring GetSelectedID
{
get { return hdnFieldSelectedID.Value; }
}
publicstring GetSelectedTitle
{
get { return hdnFieldSelectedTitle.Value; }
}
}
}

Chabok
شنبه 20 مهر 1387, 13:46 عصر
با سلام
باید در بخش ASP.net مطرح میکردید

به جای گرفتن Value فیلدها آن را ازکوئری استرینگ بخوانید . یعنی مثلا به جای

return hdnFieldSelectedTitle.Value
بنویسید

return Request[hdnFieldSelectedTitle.UniqueID]

F_Javan
شنبه 20 مهر 1387, 16:26 عصر
خیلی ممنون از راهنمایی شما ولی:
اولا این یک کلاس در پروژه از نوع Class Library هست و اجزای آن باید در درون component تعریف شوند.
ثانیا هنگامی که یک ردیف از Gridview انتخاب می شود بدون اینکه صفحه postback بشود، توسط توابع javascript سمت client ، شناسه و مقدار ردیف انتخابی در hiddenfield ریخته میشود.
مشکل اینجاست که زمانی که توسط یک دکمه مانند submit، صفحه post میشود، در سمت server، مقدار hiddenfiel ها خالی است. در حالیکه از طریق javascript مقدار دهی شده اند و با تابع alert مقدار آن چک شده است.
نمی دانم چرا hiddenfiel ها مقدار قبلی خود را از دست می دهند.

Chabok
شنبه 20 مهر 1387, 16:39 عصر
HiddenFiled ها مقدار خود را از دست نمی دهند.
بلکه دیگه نمیشه مقدارشان را از خاصیت سرور ساید Value بدست آورد .

شما باید دستی خودتون مقداری که برای صفحه پست شده رو بگیرید تا مقدار آن ها رو بدست بیارید .

در کلاس های خود هم میتونید توسط httpContext.Current.Request مقادیر پست شده رو بدست آوردید .

موفق باشید .