Afternoon all,
Apologies if this is in the wrong forum.
I have created a server control which inherits from GridView,and essentially freezes the header and scrolls the contents of the grid as opposed to Pagination.
This grid lives in side an update panel which is refreshed asyncronously.
This all works fine,I click Update this puts the Grid into Edit Mode, but when I click Cancel, ie to set EditIndex to -1 this event doesn't fire but alternatively clears the entire row , until I rebind the grid.
The Postback seems to occur after initial load but after that the events do not hit my break points even though the page posts back.
I suspect i have to reattach events somewhere but can not find nor work out how to achieve this, Delegates maybe? and do I have to attach every possible event that I may wish to use.
Code below
[ToolboxData("<{0}:ScrollingGridView runat=server></{0}:ScrollingGridView>")]
public class ScrollingGridView : GridView, IPostBackDataHandler
{
private int ScrollPosition
{
get
{
if (ViewState["ScrollPosition"] != null)
{
return Convert.ToInt32(ViewState["ScrollPosition"].ToString());
}
else
{
return 0;
}
}
set
{
ViewState["ScrollPosition"] = value;
}
}
[Browsable(true)]
public int DivWidth
{
get
{
if (ViewState["DivWidth"] != null)
{
return Convert.ToInt32(ViewState["DivWidth"].ToString());
}
else
{
return 0;
}
}
set
{
ViewState["DivWidth"] = value;
}
}
[Browsable(true)]
public int DivHeight
{
get
{
if (ViewState["DivHeight"] != null)
{
return Convert.ToInt32(ViewState["DivHeight"].ToString());
}
else
{
return 0;
}
}
set
{
ViewState["DivHeight"] = value;
}
}
#region IPostBackDataHandler Members
public bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
{
string postedValue = postCollection[this.ClientID + "_scroll"];
if (!String.IsNullOrEmpty(postedValue))
{
int presentValue = this.ScrollPosition;
this.ScrollPosition = Convert.ToInt32(postedValue);
return !presentValue.Equals(this.ScrollPosition);
}
return false;
}
protected override void OnInit(EventArgs e)
{
if (this.Page != null)
{
this.Page.RegisterRequiresPostBack(this);
}
}
protected override void OnLoad(EventArgs e)
{
}
protected override void OnPreRender(EventArgs e)
{
string key;
ScriptManager sm = ScriptManager.GetCurrent(this.Page);
sm.RegisterAsyncPostBackControl(this);
StringBuilder script = new StringBuilder();
if (sm.IsInAsyncPostBack)
{
this.HeaderRow.Style.Add("position", "relative");
this.HeaderRow.Style.Add("z-index", "10");
this.HeaderRow.Style.Add("top", this.ScrollPosition.ToString());
key = String.Format("{0}_setScrollPos", this.ClientID);
script = new StringBuilder();
script.AppendLine(" setScrollPos('" + String.Format("{0}_scroll", this.ClientID) + "','" + String.Format("{0}_div", this.ClientID) + "');");
ScriptManager.RegisterStartupScript(this.Page, this.GetType(), key, script.ToString(), true);
if (sm != null)
{
ScriptManager.RegisterStartupScript(this.Page, this.GetType(), key, script.ToString(), true);
}
else
{
this.Page.ClientScript.RegisterStartupScript(this.GetType(), key, script.ToString(), true);
}
}
else
{
key = "ScrollingGridView";
script.AppendLine("function saveScrollPos(whereID,whatID){");
script.AppendLine("document.getElementById(whereID).value = document.getElementById(whatID).scrollTop;");
script.AppendLine("}");
script.AppendLine("function setScrollPos(whereID, whatID){");
script.AppendLine("document.getElementById(whatID).scrollTop = (document.getElementById(whereID).value.length > 0) ? document.getElementById(whereID).value : 0;");
script.AppendLine("}");
if (sm != null)
{
ScriptManager.RegisterStartupScript(this.Page, this.GetType(), key, script.ToString(), true);
ScriptManager.RegisterHiddenField(this.Page, String.Format("{0}_scroll", this.ClientID), this.ScrollPosition.ToString());
}
else
{
this.Page.ClientScript.RegisterStartupScript(this.GetType(), key, script.ToString(), true);
this.Page.ClientScript.RegisterHiddenField(String.Format("{0}_scroll", this.ClientID), this.ScrollPosition.ToString());
}
this.HeaderRow.Style.Add("position", "relative");
this.HeaderRow.Style.Add("z-index", "10");
this.HeaderRow.Style.Add("top", this.ScrollPosition.ToString());
key = String.Format("{0}_setScrollPos", this.ClientID);
script = new StringBuilder();
script.AppendLine(" setScrollPos('" + String.Format("{0}_scroll", this.ClientID) + "','" + String.Format("{0}_div", this.ClientID) + "');");
ScriptManager.RegisterStartupScript(this.Page, this.GetType(), key, script.ToString(), true);
if (sm != null)
{
ScriptManager.RegisterStartupScript(this.Page, this.GetType(), key, script.ToString(), true);
}
else
{
this.Page.ClientScript.RegisterStartupScript(this.GetType(), key, script.ToString(), true);
}
}
}
protected override void Render(HtmlTextWriter writer)
{
if (this.Page != null)
{
this.Page.VerifyRenderingInServerForm(this);
}
this.PrepareControlHierarchy();
if (!this.DesignMode)
{
if (String.IsNullOrEmpty(this.ClientID))
{
throw new HttpException("ScrollingGridView must be parented!");
}
writer.AddAttribute(HtmlTextWriterAttribute.Id, String.Format("{0}_div", this.ClientID), true);
writer.AddAttribute("onScroll", "saveScrollPos('" + String.Format("{0}_scroll", ClientID) + "', '" + String.Format("{0}_div", this.ClientID) + "');");
writer.AddStyleAttribute(HtmlTextWriterStyle.MarginTop, "0px");
writer.AddStyleAttribute(HtmlTextWriterStyle.OverflowY, "auto");
writer.AddStyleAttribute(HtmlTextWriterStyle.Height, this.DivHeight.ToString() + "px");
writer.AddStyleAttribute(HtmlTextWriterStyle.Width, this.DivWidth.ToString() + "px");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
}
this.RenderContents(writer);
if (!this.DesignMode)
{
writer.RenderEndTag();
}
}
#endregion
#region IPostBackDataHandler Members
public void RaisePostDataChangedEvent()
{
this.DataBind();
}
#endregion
Apologies if this is in the wrong forum.
I have created a server control which inherits from GridView,and essentially freezes the header and scrolls the contents of the grid as opposed to Pagination.
This grid lives in side an update panel which is refreshed asyncronously.
This all works fine,I click Update this puts the Grid into Edit Mode, but when I click Cancel, ie to set EditIndex to -1 this event doesn't fire but alternatively clears the entire row , until I rebind the grid.
The Postback seems to occur after initial load but after that the events do not hit my break points even though the page posts back.
I suspect i have to reattach events somewhere but can not find nor work out how to achieve this, Delegates maybe? and do I have to attach every possible event that I may wish to use.
Code below
[ToolboxData("<{0}:ScrollingGridView runat=server></{0}:ScrollingGridView>")]
public class ScrollingGridView : GridView, IPostBackDataHandler
{
private int ScrollPosition
{
get
{
if (ViewState["ScrollPosition"] != null)
{
return Convert.ToInt32(ViewState["ScrollPosition"].ToString());
}
else
{
return 0;
}
}
set
{
ViewState["ScrollPosition"] = value;
}
}
[Browsable(true)]
public int DivWidth
{
get
{
if (ViewState["DivWidth"] != null)
{
return Convert.ToInt32(ViewState["DivWidth"].ToString());
}
else
{
return 0;
}
}
set
{
ViewState["DivWidth"] = value;
}
}
[Browsable(true)]
public int DivHeight
{
get
{
if (ViewState["DivHeight"] != null)
{
return Convert.ToInt32(ViewState["DivHeight"].ToString());
}
else
{
return 0;
}
}
set
{
ViewState["DivHeight"] = value;
}
}
#region IPostBackDataHandler Members
public bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
{
string postedValue = postCollection[this.ClientID + "_scroll"];
if (!String.IsNullOrEmpty(postedValue))
{
int presentValue = this.ScrollPosition;
this.ScrollPosition = Convert.ToInt32(postedValue);
return !presentValue.Equals(this.ScrollPosition);
}
return false;
}
protected override void OnInit(EventArgs e)
{
if (this.Page != null)
{
this.Page.RegisterRequiresPostBack(this);
}
}
protected override void OnLoad(EventArgs e)
{
}
protected override void OnPreRender(EventArgs e)
{
string key;
ScriptManager sm = ScriptManager.GetCurrent(this.Page);
sm.RegisterAsyncPostBackControl(this);
StringBuilder script = new StringBuilder();
if (sm.IsInAsyncPostBack)
{
this.HeaderRow.Style.Add("position", "relative");
this.HeaderRow.Style.Add("z-index", "10");
this.HeaderRow.Style.Add("top", this.ScrollPosition.ToString());
key = String.Format("{0}_setScrollPos", this.ClientID);
script = new StringBuilder();
script.AppendLine(" setScrollPos('" + String.Format("{0}_scroll", this.ClientID) + "','" + String.Format("{0}_div", this.ClientID) + "');");
ScriptManager.RegisterStartupScript(this.Page, this.GetType(), key, script.ToString(), true);
if (sm != null)
{
ScriptManager.RegisterStartupScript(this.Page, this.GetType(), key, script.ToString(), true);
}
else
{
this.Page.ClientScript.RegisterStartupScript(this.GetType(), key, script.ToString(), true);
}
}
else
{
key = "ScrollingGridView";
script.AppendLine("function saveScrollPos(whereID,whatID){");
script.AppendLine("document.getElementById(whereID).value = document.getElementById(whatID).scrollTop;");
script.AppendLine("}");
script.AppendLine("function setScrollPos(whereID, whatID){");
script.AppendLine("document.getElementById(whatID).scrollTop = (document.getElementById(whereID).value.length > 0) ? document.getElementById(whereID).value : 0;");
script.AppendLine("}");
if (sm != null)
{
ScriptManager.RegisterStartupScript(this.Page, this.GetType(), key, script.ToString(), true);
ScriptManager.RegisterHiddenField(this.Page, String.Format("{0}_scroll", this.ClientID), this.ScrollPosition.ToString());
}
else
{
this.Page.ClientScript.RegisterStartupScript(this.GetType(), key, script.ToString(), true);
this.Page.ClientScript.RegisterHiddenField(String.Format("{0}_scroll", this.ClientID), this.ScrollPosition.ToString());
}
this.HeaderRow.Style.Add("position", "relative");
this.HeaderRow.Style.Add("z-index", "10");
this.HeaderRow.Style.Add("top", this.ScrollPosition.ToString());
key = String.Format("{0}_setScrollPos", this.ClientID);
script = new StringBuilder();
script.AppendLine(" setScrollPos('" + String.Format("{0}_scroll", this.ClientID) + "','" + String.Format("{0}_div", this.ClientID) + "');");
ScriptManager.RegisterStartupScript(this.Page, this.GetType(), key, script.ToString(), true);
if (sm != null)
{
ScriptManager.RegisterStartupScript(this.Page, this.GetType(), key, script.ToString(), true);
}
else
{
this.Page.ClientScript.RegisterStartupScript(this.GetType(), key, script.ToString(), true);
}
}
}
protected override void Render(HtmlTextWriter writer)
{
if (this.Page != null)
{
this.Page.VerifyRenderingInServerForm(this);
}
this.PrepareControlHierarchy();
if (!this.DesignMode)
{
if (String.IsNullOrEmpty(this.ClientID))
{
throw new HttpException("ScrollingGridView must be parented!");
}
writer.AddAttribute(HtmlTextWriterAttribute.Id, String.Format("{0}_div", this.ClientID), true);
writer.AddAttribute("onScroll", "saveScrollPos('" + String.Format("{0}_scroll", ClientID) + "', '" + String.Format("{0}_div", this.ClientID) + "');");
writer.AddStyleAttribute(HtmlTextWriterStyle.MarginTop, "0px");
writer.AddStyleAttribute(HtmlTextWriterStyle.OverflowY, "auto");
writer.AddStyleAttribute(HtmlTextWriterStyle.Height, this.DivHeight.ToString() + "px");
writer.AddStyleAttribute(HtmlTextWriterStyle.Width, this.DivWidth.ToString() + "px");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
}
this.RenderContents(writer);
if (!this.DesignMode)
{
writer.RenderEndTag();
}
}
#endregion
#region IPostBackDataHandler Members
public void RaisePostDataChangedEvent()
{
this.DataBind();
}
#endregion