Initially had a problem when trying to save a datagridview that was bound using binding source(http://www.lhotka.net/Article.aspx?area=4&id=91e15def-fa1c-4236-86b5-b204bfc4a0aa). That was resolved by overriding DataPortal_Update() method in BusinessListBase(http://forums.lhotka.net/forums/p/6398/34829.aspx). but now I am getting another error.
Here is where it breaks because mh.DynamicMethod is null:
public static object CallMethod(object obj, string method, params object[] parameters)
{
var mh = GetCachedMethod(obj, method, parameters);
if (mh == null || mh.DynamicMethod == null)
throw new NotImplementedException(method + " " + Resources.MethodNotImplemented);
return CallMethod(obj, mh, parameters);
}
Exception Message:
{"DataPortal.Update failed (Csla.DataPortalException: ChildDataPortal.Update failed on the server ---> System.NotImplementedException: Child_Update not implemented\r\n at Csla.Reflection.MethodCaller.CallMethod(Object obj, String method, Object[] parameters) in C:\\Users\\ddavis\\Desktop\\cslacs-3.8.4-100811\\cslacs\\Csla\\Reflection\\MethodCaller.cs:line 269\r\n at Csla.Reflection.LateBoundObject.CallMethod(String method, Object[] parameters) in C:\\Users\\ddavis\\Desktop\\cslacs-3.8.4-100811\\cslacs\\Csla\\Reflection\\LateBoundObject.cs:line 86\r\n at Csla.Server.ChildDataPortal.Update(Object obj, Object[] parameters) in C:\\Users\\ddavis\\Desktop\\cslacs-3.8.4-100811\\cslacs\\Csla\\Server\\ChildDataPortal.cs:line 207\r\n --- End of inner exception stack trace ---\r\n at Csla.Reflection.MethodCaller.CallMethod(Object obj, String method, Object[] parameters) in C:\\Users\\ddavis\\Desktop\\cslacs-3.8.4-100811\\cslacs\\Csla\\Reflection\\MethodCaller.cs:line 269\r\n at Csla.Reflection.LateBoundObject.CallMethod(String method, Object[] parameters) in C:\\Users\\ddavis\\Desktop\\cslacs-3.8.4-100811\\cslacs\\Csla\\Reflection\\LateBoundObject.cs:line 86\r\n at Csla.Server.ChildDataPortal.Update(Object obj, Object[] parameters) in C:\\Users\\ddavis\\Desktop\\cslacs-3.8.4-100811\\cslacs\\Csla\\Server\\ChildDataPortal.cs:line 207\r\n at Csla.Server.ChildDataPortal.Update(Object obj, Object[] parameters) in C:\\Users\\ddavis\\Desktop\\cslacs-3.8.4-100811\\cslacs\\Csla\\Server\\ChildDataPortal.cs:line 258\r\n at Csla.DataPortal.UpdateChild(Object child, Object[] parameters) in C:\\Users\\ddavis\\Desktop\\cslacs-3.8.4-100811\\cslacs\\Csla\\DataPortal.cs:line 939\r\n at Csla.BusinessListBase`2.Child_Update(Object[] parameters) in C:\\Users\\ddavis\\Desktop\\cslacs-3.8.4-100811\\cslacs\\Csla\\BusinessListBase.cs:line 966\r\n at Medflow.DataAccess.MFFACILITIESList.DataPortal_Update() in C:\\SSUPDATES\\NET 2.0\\DLLs\\MedflowDataAccess\\Code\\Collections\\MFFACILITIESList.DataAccess.cs:line 73\r\n at dm(Object , Object[] )\r\n at Csla.Reflection.MethodCaller.CallMethod(Object obj, DynamicMethodHandle methodHandle, Object[] parameters) in C:\\Users\\ddavis\\Desktop\\cslacs-3.8.4-100811\\cslacs\\Csla\\Reflection\\MethodCaller.cs:line 357)"}
Stack Trace:
at Csla.Reflection.MethodCaller.CallMethod(Object obj, String method, Object[] parameters) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\Reflection\MethodCaller.cs:line 269
at Csla.Reflection.LateBoundObject.CallMethod(String method, Object[] parameters) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\Reflection\LateBoundObject.cs:line 86
at Csla.Server.ChildDataPortal.Update(Object obj, Object[] parameters) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\Server\ChildDataPortal.cs:line 207
at Csla.Server.ChildDataPortal.Update(Object obj, Object[] parameters) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\Server\ChildDataPortal.cs:line 258
at Csla.DataPortal.UpdateChild(Object child, Object[] parameters) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\DataPortal.cs:line 939
at Csla.BusinessListBase`2.Child_Update(Object[] parameters) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\BusinessListBase.cs:line 966
at Medflow.DataAccess.MFFACILITIESList.DataPortal_Update() in C:\SSUPDATES\NET 2.0\DLLs\MedflowDataAccess\Code\Collections\MFFACILITIESList.DataAccess.cs:line 73
at dm(Object , Object[] )
at Csla.Reflection.MethodCaller.CallMethod(Object obj, DynamicMethodHandle methodHandle, Object[] parameters) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\Reflection\MethodCaller.cs:line 357
at Csla.Reflection.MethodCaller.CallMethod(Object obj, DynamicMethodHandle methodHandle, Object[] parameters) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\Reflection\MethodCaller.cs:line 361
at Csla.Reflection.MethodCaller.CallMethod(Object obj, String method, Object[] parameters) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\Reflection\MethodCaller.cs:line 270
at Csla.Reflection.LateBoundObject.CallMethod(String method) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\Reflection\LateBoundObject.cs:line 70
at Csla.Server.SimpleDataPortal.Update(Object obj, DataPortalContext context) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\Server\SimpleDataPortal.cs:line 230
at Csla.DataPortal.Update(Object obj) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\DataPortal.cs:line 480
at Csla.DataPortal.Update[T](T obj) in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\DataPortal.cs:line 336
at Csla.BusinessListBase`2.Save() in C:\Users\ddavis\Desktop\cslacs-3.8.4-100811\cslacs\Csla\BusinessListBase.cs:line 1027
at MFFacilitiesBL.Facilities.SaveForm(BindingSource bsFacilities, Boolean rebind) in C:\SSUPDATES\NET 2.0\DLLs\MFFacilitiesBL\Code\Facilities.cs:line 55
Hi,
Looks like the list item in Medflow.DataAccess.MFFACILITIESList does not implement a Child_Update method with the expected signature (parameters).
No it does not. According to this article(http://forums.lhotka.net/forums/p/6398/34829.aspx) I only needed to override DataPortal_Update to call Child_Update(). Is there something more that needs to be done?
protected override void DataPortal_Update()
{
using (SqlConnection connection = new SqlConnection(ADOHelper.ConnectionString))
{
connection.Open();
Child_Update();
}
}
This is most likely the code you call in BusinessListBase:
protected virtual void Child_Update(params object[] parameters) { var oldRLCE = this.RaiseListChangedEvents; this.RaiseListChangedEvents = false; try { foreach (var child in DeletedList) DataPortal.UpdateChild(child, parameters); DeletedList.Clear(); foreach (var child in this) if (child.IsDirty) DataPortal.UpdateChild(child, parameters); } finally { this.RaiseListChangedEvents = oldRLCE; } }
And the DataPortal.UpdateChild will in turn call ChildDataPortal.Update (semantic code shown below) for each Deleted item or IsDirty item:
if (busObj.IsDeleted) { if (!busObj.IsNew) { // tell the object to delete itself lb.CallMethod("Child_DeleteSelf", parameters); } lb.CallMethodIfImplemented("MarkNew"); } else { if (busObj.IsNew) { // tell the object to insert itself lb.CallMethod("Child_Insert", parameters); } else { // tell the object to update itself lb.CallMethod("Child_Update", parameters); } if (target != null) target.MarkOld(); else lb.CallMethodIfImplemented("MarkOld"); }
The point being that your items class in the BusinessList must implement these 3 methods to save itself:
Now your code in the list calls Child_Update with no parameters (like a parentId from the parent object for relationship) so for your existing code these methods must exist with no parameters.
Copyright (c) Marimer LLC