I have embedded a WebGrid into a SharePoint web part and it works OK - I create the grid programatically and add it using CreateChildControls method.
I have one issue which is after I add my WegGrid-containing web part to the MOSS page. I do this in MOSS via Site Actions - Edit Page and edit the web part page, click a web part zone and pick my web part to add it. It goes onto the page fine, but I can't close the web part using the X in the top right corner. I can add other built-in web parts to the page and close them OK, e.g. content query web part, content editor web part etc. But when I try to close my own web part in MOSS the browser doesn't post back and just does nothing. The same thing happens if I click the Edit dropdown and select Close or Delete - again the web part is not removed from the page.
I know this isn't a MOSS forum but I wonder if anyone else has had this problem? Seems like it might be to do with Javascript on the page?
The browser is IE7. Firefox doesn't have the same issue but you need to use IE really for MOSS work.
I get the same issue even with a very simple grid as per the example below. It seems to jam up the postback on the page so none fo the SharePoint buttons will do a postback. If I comment out the call to Bind() then it works OK. Is there something else I need to do?
using System; using System.Collections.Generic; using System.Text; using Infragistics.WebUI.UltraWebGrid; using System.Data; namespace UltraGridDemoWP2 { public class UltraGridDemoWP2 : System.Web.UI.WebControls.WebParts.WebPart { private UltraWebGrid _grid; public UltraWebGrid Grid { get { EnsureChildControls(); return _grid; } } protected override void CreateChildControls() { base.CreateChildControls(); _grid = new UltraWebGrid("Grid"); this.Controls.Add(_grid); Bind(); // Comment this out and it doesn't jam up the postback } private void Bind() { Grid.DataSource = getdata(); Grid.DataBind(); } private DataTable getdata() { DataTable t = new DataTable(); t.Columns.Add(new DataColumn("Col1")); t.Columns.Add(new DataColumn("Col2")); for (int i = 0; i < 10; i++) { DataRow r = t.NewRow(); r["Col1"] = "col1-" + i.ToString(); r["Col2"] = "col2-" + i.ToString(); t.Rows.Add(r); } return t; } } }
OK I have stumbled on a solution but I'm not sure exactly why it works! I found if you set the grid to have an ID that is a GUID, everything works OK. So I changed the grid variable to intialise it:
private UltraWebGrid _grid = null;
protected override void CreateChildControls() { base.CreateChildControls(); if (_grid == null) { _grid = new UltraWebGrid(Guid.NewGuid().ToString()); } this.Controls.Add(_grid); Bind(); }
My thinking was that there might be a problem with invisible closed webgrids on the page and that I had to make sure that each webgrid had a unique ID on the page, so I gave it a GUID. However, I have tried replacing the Guid.NewGuid().ToString() with a very large random number generated from the Random class and that still causes the error even though the random ID of the grid is unique on the page. It just seems like the ID has to be a GUID string - can anyone explain?
Another workaround is to set the ReadOnly property of the webgrid within the CreateChildControls method - this reduces the amount of Javascript that the control renders onto the page:
Grid.DisplayLayout.ReadOnly = ReadOnly.LevelTwo;