Thank you for the quick response Jason,
Nevermind, I've created a dummy FinelineDescription class to performed the
test and I've got your page running
. And after some test, I think the
problem here is still as mentioned in my first reply message. The
GridView.UpdateRow method will only update the current EditRow (the current
EditIndex row in the GridView) or those Rows which has Twoway databinding
Columns(the columns/template you created dyanmically are all one-way
databinding---just for display). So for your Gridview(dynamically created),
all the rows are in readonly/normal mode, so when you call update, the
dataobject's updatemethod did get executed, however, it passed Null into
the DataObject (ScrubDataObject).... Here is my modfied test page which
use a dummy finelineDescription class(I also use fake data for the
ScrubDataObject and its ItemDescription member...) :
============aspx==============
remain the same
======code behind=============
public partial class Common_DynamicWizardGridView : System.Web.UI.Page
{
private Wizard frame = new Wizard();
private int choice;
private DateTime week;
protected void Page_Init(object sender, EventArgs e)
{
Parameter p = new Parameter();
FinelineDescription fineline = new FinelineDescription();
//choice = int.Parse(Request.QueryString["q"]);
//week = DateTime.Parse(Request.QueryString["d"]);
choice = 3;
week = DateTime.Now;
p.Name = "data";
p.Direction = ParameterDirection.Input;
p.Type = TypeCode.Object;
frame.ID = "wzdfilterrecords";
frame.NavigationStyle.HorizontalAlign = HorizontalAlign.Left;
frame.NavigationStyle.VerticalAlign = VerticalAlign.Top;
frame.SideBarStyle.HorizontalAlign = HorizontalAlign.Left;
frame.SideBarStyle.VerticalAlign = VerticalAlign.Top;
frame.SideBarStyle.Width = Unit.Percentage(15);
frame.Width = Unit.Percentage(100);
frame.FinishButtonClick += new
WizardNavigationEventHandler(frame_FinishButtonClick);
foreach (FinelineDescription f in
FinelineDescription.getDescriptions(choice,
week))
{
WizardStep step = new WizardStep();
GridView grid = new GridView();
grid.EditIndex = 0;
ObjectDataSource ods = new
ObjectDataSource(getClassName(choice), "getRecords");
step.Title = f.Description;
step.ID = "step_" + frame.WizardSteps.Count;
step.StepType = (frame.WizardSteps.Count.Equals(0)) ?
WizardStepType.Start : WizardStepType.Step;
ods.ID = "ods_" + frame.WizardSteps.Count;
ods.SelectParameters.Add("weekBeginDate", week.ToString());
ods.SelectParameters.Add("finelineDescription", f.Description);
ods.UpdateMethod = "updateOmitStatus";
ods.UpdateParameters.Add(p);
grid.AutoGenerateColumns = false;
grid.DataSourceID = ods.ID;
grid.ID = "grid_" + frame.WizardSteps.Count;
grid.Columns.Add(addCheckBoxColumn());
grid.Columns.Add(addColumn("DistrobutionCenterID", "DC ID",
Unit.Pixel(45)));
grid.Columns.Add(addColumn("DistrobutionCenterName", "DC Name",
Unit.Percentage(25)));
grid.Columns.Add(addItemNumberTemplate("Item #",
Unit.Pixel(50)));
grid.Columns.Add(addItemDescriptionTemplate("Item Description",
Unit.Percentage(20)));
grid.Columns.Add(addColumn("StoreOnHand", "Store OH",
Unit.Pixel(55)));
grid.Columns.Add(addColumn("InTransitOnHand", "In Transit OH",
Unit.Pixel(55)));
grid.Columns.Add(addColumn("WarehouseOnHand", "Warehouse OH",
Unit.Pixel(55)));
grid.Columns.Add(addColumn("CurrentOrder", "Current Order",
Unit.Pixel(55)));
grid.Width = Unit.Percentage(100);
step.Controls.Add(ods);
step.Controls.Add(grid);
frame.WizardSteps.Add(step);
}
if (frame.WizardSteps.Count > 0)
{
WizardStep finalstep = new WizardStep();
Literal lit = new Literal();
finalstep.Title = "Commit Changes";
finalstep.ID = "step_" + frame.WizardSteps.Count;
finalstep.Controls.Add(lit);
finalstep.StepType = WizardStepType.Finish;
lit.Text = "Click Finish to commit changes and generate a
report.";
frame.WizardSteps.Add(finalstep);
hldrwizard.Controls.Add(frame);
}
else
{
Literal norecords = new Literal();
norecords.Text = string.Format("There are no {0} on
{1}.",getRecordType(choice), week.ToShortDateString());
hldrwizard.Controls.Add(norecords);
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
lbldate.Text = week.ToShortDateString();
lblrecordtype.Text = getRecordType(choice);
if (frame.WizardSteps.Count > 0)
frame.ActiveStepIndex = 0;
}
}
protected void frame_FinishButtonClick(object sender,
WizardNavigationEventArgs e)
{
Response.Write("<br/>frame_FinishButtonClick.............");
List<GridView> grids = new List<GridView>();
foreach (WizardStep step in frame.WizardSteps)
{
//not the final step
if (!step.StepType.Equals(WizardStepType.Finish))
{
GridView grid = (GridView)step.FindControl("grid_" +
frame.WizardSteps.IndexOf(step).ToString());
ObjectDataSource ods =
(ObjectDataSource)step.FindControl("ods_" +
frame.WizardSteps.IndexOf(step).ToString());
foreach (GridViewRow row in grid.Rows)
{
if (row.RowType.Equals(DataControlRowType.DataRow))
{
Response.Write("<br/>BeforeUpdate: " +
row.NamingContainer.ID + "__" + row.RowIndex);
grid.EditIndex = row.RowIndex;
grid.UpdateRow(row.RowIndex, false);
}
}
}
}
if (choice.Equals(3))
ScrubDataObject.transferToLiveData(week);
}
private string getRecordType(int choice)
{
switch (choice)
{
case 1:
return "Omit Records";
case 2:
return "Report Records";
case 3:
return "New Records";
default: return string.Empty;
}
}
private string getClassName(int choice)
{
switch (choice)
{
case 1:
return "SBI.RetailLink.DataAccess.OmitDataObject";
case 2:
return "SBI.RetailLink.DataAccess.ReportDataObject";
case 3:
return "SBI.RetailLink.DataAccess.ScrubDataObject";
default: return string.Empty;
}
}
private TemplateField addCheckBoxColumn()
{
TemplateField field = new TemplateField();
field.ItemTemplate = new GridViewCheckBoxTemplate();
field.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
field.ItemStyle.VerticalAlign = VerticalAlign.Middle;
field.ItemStyle.Width = Unit.Pixel(20);
field.HeaderText = "Omit";
field.HeaderStyle.VerticalAlign = VerticalAlign.Bottom;
field.HeaderStyle.Width = Unit.Pixel(20);
return field;
}
private TemplateField addItemDescriptionTemplate(string header, Unit
width)
{
TemplateField field = new TemplateField();
field.ItemTemplate = new GridViewItemDescriptionTemplate();
field.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
field.ItemStyle.VerticalAlign = VerticalAlign.Middle;
field.ItemStyle.Width = width;
field.HeaderText = header;
field.HeaderStyle.VerticalAlign = VerticalAlign.Bottom;
field.HeaderStyle.Width = width;
return field;
}
private TemplateField addItemNumberTemplate(string header, Unit width)
{
TemplateField field = new TemplateField();
field.ItemTemplate = new GridViewItemNumberTemplate();
field.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
field.ItemStyle.VerticalAlign = VerticalAlign.Middle;
field.ItemStyle.Width = width;
field.HeaderText = header;
field.HeaderStyle.VerticalAlign = VerticalAlign.Bottom;
field.HeaderStyle.Width = width;
return field;
}
private BoundField addColumn(string dataField, string header, Unit
width)
{
BoundField field = new BoundField();
field.DataField = dataField;
field.ItemStyle.VerticalAlign = VerticalAlign.Top;
field.ItemStyle.Width = width;
field.HeaderText = header;
field.HeaderStyle.VerticalAlign = VerticalAlign.Bottom;
field.HeaderStyle.Width = width;
field.ReadOnly = true;
return field;
}
}
// Create a template class to represent a dynamic template column.
public class GridViewCheckBoxTemplate : ITemplate
{
public GridViewCheckBoxTemplate()
{
}
public void InstantiateIn(System.Web.UI.Control container)
{
CheckBox check = new CheckBox();
check.AutoPostBack = false;
check.CausesValidation = false;
check.DataBinding += new EventHandler(check_DataBinding);
container.Controls.Add(check);
}
private void check_DataBinding(Object sender, EventArgs e)
{
CheckBox c = (CheckBox)sender;
GridViewRow row = (GridViewRow)c.NamingContainer;
c.Checked = (bool)DataBinder.Eval(row.DataItem, "OmitReport");
}
}
public class GridViewItemDescriptionTemplate : ITemplate
{
public GridViewItemDescriptionTemplate()
{
}
public void InstantiateIn(System.Web.UI.Control container)
{
Label lbl = new Label();
lbl.DataBinding += new EventHandler(lbl_DataBinding);
container.Controls.Add(lbl);
}
private void lbl_DataBinding(Object sender, EventArgs e)
{
Label l = (Label)sender;
GridViewRow row = (GridViewRow)l.NamingContainer;
l.Text = ((ItemDescription)DataBinder.Eval(row.DataItem,
"ItemDescription")).itemDescription;
}
}
public class GridViewItemNumberTemplate : ITemplate
{
public GridViewItemNumberTemplate()
{
}
public void InstantiateIn(System.Web.UI.Control container)
{
Label lbl = new Label();
lbl.DataBinding += new EventHandler(lbl_DataBinding);
container.Controls.Add(lbl);
}
private void lbl_DataBinding(Object sender, EventArgs e)
{
Label l = (Label)sender;
GridViewRow row = (GridViewRow)l.NamingContainer;
l.Text = ((ItemDescription)DataBinder.Eval(row.DataItem,
"ItemDescription")).itemNumber.ToString();
}
}
==================================
======my customized dummy classes========
public class ScrubDataObject
{
.........................
public static List<ScrubData> getRecords(DateTime weekBeginDate,
string finelineDescription)
{
bool value;
List<ScrubData> types = new List<ScrubData>();
for (int i = 0; i < 5; i++)
{
ScrubData sd = new ScrubData();
sd.CurrentOrder = i * 1;
sd.DistrobutionCenterID = i * 6;
sd.DistrobutionCenterName = "dcenter_" + i;
sd.FinelineDescription = finelineDescription;
sd.InTransitOnHand = i * 2;
//sd.ItemDescription = null;
sd.OmitReport = i % 2== 0 ? true : false;
sd.PointOfSale = i * 3;
sd.StoreOnHand = i * 4;
sd.WarehouseOnHand = i * 5;
sd.WeekBeginDate = weekBeginDate;
sd.ItemDescription = new ItemDescription();
sd.ItemDescription.itemDescription = "ItemDesc_" +
sd.GetHashCode();
sd.ItemDescription.itemNumber = sd.GetHashCode();
types.Add(sd);
}
return types;
}
public static void updateOmitStatus(ScrubData data)
{
ScrubData olddata = data;
bool isNull = data == null;
HttpContext.Current.Response.Write("<br/>updateOmitStatus: " +
isNull);
HttpContext.Current.Response.Write("<br/>updateOmitStatus: " +
isNull);
}
......................
}
///////////////////////////////
public class FinelineDescription
{
public string Description;
public static List<FinelineDescription> getDescriptions(int choice,
DateTime week)
{
List<FinelineDescription> lines = new
List<FinelineDescription>();
for (int i = 0; i < 2; i++)
{
FinelineDescription line = new FinelineDescription();
line.Description = "Description_" + i;
lines.Add(line);
}
return lines;
}
}
=========================================
I didn't get "Null Reference" exception here( at least with these test
dummy classes...). Also, I've tested with Statically put a Gridview and
ObjectDataSource on a page, and use the Data Objects(I enable Editing for
the GridView), and when I programmtically call the GridView.UpdateRow, it
can update the Rows(passed a valid scurbDataObject to the data class's
updatemethod).
So I think the problem now is we need to use two-way databinding column for
the GridView so as to make it passed the value from GridView row to Data
object (when performing update operation). And the basic means of two-way
databinding is using boundfield. And I still recommend you consider
encapsulate the GridView+ObjectdataSource into a UserControl, since thus
you can define the columns statically in usercontrol template(usercontrol
can be dyanmically loaded into page/wizard). If you feel it ok, I can help
try creating a simple demo page on this.
Regards,
Steven Cheng
Microsoft Online Community Support
==================================================
When responding to posts, please "Reply to Group" via your newsreader so
that others may learn and benefit from your issue.
==================================================
This posting is provided "AS IS" with no warranties, and confers no rights.