Ian Hammond
|
|
Group: Forum Members
Posts: 57,
Visits: 277
|
In this particular instance I am using a listview control to display user names that can access my application. There are 2 custom fields whose content is fetched from another table. I have the listview bound to a business object which reads my usernamesBO. Each user has an entry in a userprofiles table which contains a boolean flag saying if they are logged into the application and the name of the computer they are using. My listview displays the username, description, Computer Name, Logged In There is a toolbar with Save Cancel Add Edit Delete When the user click Add or Edit a child form is displayed allowing to make changes to the user profile. The BO is passed as an argument to the child form. If the user Add's a new profile, I execute a BO.NewRow() followed by assigning data to the fields. The ComputerName and LoggedIn are initialised to default values. The form is disposed an the user is returned to the parent form which excutes a listView.Requery(). Here, I am trying to display the new row. The Requery causes the following event to be invoked:
// Populate computer name and logged-in status
private void listViewUserNames_RowPopulating(MicroFour.StrataFrame.UI.Windows.Forms.RowPopulatingEventArgs e)
{
HLSUserNamesBO loBO= (HLSUserNamesBO)e.BusinessObject;
if (this.hlsUserProfilesBO1.Seek("userId = " + loBO.userId.ToString()))
{
e.Values[2].DisplayValue = this.hlsUserProfilesBO1.computerName;
e.Values[3].DisplayValue = (Boolean)this.hlsUserProfilesBO1.loggedIn ? Global.RetrieveTextValue("Text_Yes") : Global.RetrieveTextValue("Text_No");
}
else
{
e.Values[2].DisplayValue = "";
e.Values[3].DisplayValue = Global.RetrieveTextValue("Text_No");
}
}
This code works fine when the form is initially loaded but when I return from the Add command, the section LoggedIn section causes the exception to be raised. On load the first Id =1 and this loads ok, the second record load ok. When I return from Add the first Id =1 and it fails. I'm not sure why this is. Can anyone priovide an explanation or solution? Many thanks
|
|
|
Trent Taylor
|
|
Group: StrataFrame Developers
Posts: 6.6K,
Visits: 6.9K
|
What was the stack trace of the error that you received?
|
|
|
Ian Hammond
|
|
Group: Forum Members
Posts: 57,
Visits: 277
|
Hi Trent,
Hope the following is meaningful, Regards
System.Reflection.TargetInvocationException was unhandled by user code Message=Exception has been thrown by the target of an invocation. Source=mscorlib StackTrace: at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture) at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index) at MicroFour.StrataFrame.Business.ReflectionPropertyDescriptor.GetValue(Object component) at MicroFour.StrataFrame.Business.BusinessLayer.get_Item(String FieldName) at MicroFour.StrataFrame.UI.Windows.Forms.ListView.CreateListViewItem(BusinessLayer BusinessObject) at MicroFour.StrataFrame.UI.Windows.Forms.ListView.PopulateListView(Object[] Parameters) at MicroFour.StrataFrame.UI.Windows.Forms.ListView.Requery() at Greenfield.HLSPro.Forms.UserNamesForm.cmdAdd_Click(Object sender, EventArgs e) in D:\HLS v5 Development\HLS v5\HLS v5\Forms\UserNamesForm.cs:line 56 at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e) at System.Windows.Forms.ToolStripButton.OnClick(EventArgs e) at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e) at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e) at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met) at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met) at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea) at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ScrollableControl.WndProc(Message& m) at System.Windows.Forms.ToolStrip.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativewindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativewindow.WndProc(Message& m) at System.Windows.Forms.Nativewindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) InnerException: System.InvalidCastException Message=Specified cast is not valid. Source=HLS v5 StackTrace: at Greenfield.HLSPro.Business_Objects.HLSUserNamesBO.get_loggedIn() in D:\HLS v5 Development\HLS v5\HLS v5\Business Objects\HLSUserNamesBO.cs:line 148 InnerException:
|
|
|
Trent Taylor
|
|
Group: StrataFrame Developers
Posts: 6.6K,
Visits: 6.9K
|
Well, it is telling you that on line 56 of the class code that you provided, there is an invalid cast exception. In other words, something is trying to be converted, illegally, from one data type to another. Debug your code and put a break point on line 56 to evaluate what the contents are of the value being stuffed into the display. This should clue you in as to where the problem is occurring.
|
|
|
Ian Hammond
|
|
Group: Forum Members
Posts: 57,
Visits: 277
|
Hi,
I had already traced the code. What I found on initial load was that the usernameBO was populated with values for Computername and Logged_In, but, return from the Add operation these 2 fields were null, hence the exception, but I don't quite understand why this is so. Where I assign a value to e.Values[3] it goes bombing off to the usernamesBO into the PropertyDescriptors method of the usernamesBO until it finally generates the exception.
Regards
|
|
|
Trent Taylor
|
|
Group: StrataFrame Developers
Posts: 6.6K,
Visits: 6.9K
|
Can you shoot me a screentshot of your PopulationDataSourceSettings dialog? This might help as well.
|
|
|
Ian Hammond
|
|
Group: Forum Members
Posts: 57,
Visits: 277
|
Hi Trent,
Please find attachment, as requested.
Regards
|
|
|
Trent Taylor
|
|
Group: StrataFrame Developers
Posts: 6.6K,
Visits: 6.9K
|
I had already traced the code. What I found on initial load was that the usernameBO was populated with values for Computername and Logged_In, but, return from the Add operation these 2 fields were null,
Are you initializing these fields when you handle your Add? The issue you are running into is outside of the query, but rather elsewhere in your code. I am willing to bet that the add is your culprit. If you create a new user and inspect the CurrentDataTable, are there nulls in your table? I bet that there are and that this is causing the issue.
|
|
|
Ian Hammond
|
|
Group: Forum Members
Posts: 57,
Visits: 277
|
Hi Trent,
You are right, the fields are not initialised, although in my child form which is invoked when I click Add, on exit I do:
myUserNamesBO.NewRow();
myUserNamesBO.loggedIn = false;
myUserNamesBO.computerName = " ";
etc.
myUserNamesBO.Save();
I assumed that the fields were initialised. Can you say where is the best place to initialise the fields, am I missing something out?
Regards
|
|
|
Trent Taylor
|
|
Group: StrataFrame Developers
Posts: 6.6K,
Visits: 6.9K
|
Well, it depends. By default a BO will initialize all of the fields unless you tell it not to. But the best place to initialize a field is in the SetDefaultValues event of the BO.
|
|
|