StrataFrame Forum

ComboBoxEdit Requery Event Failing

http://forum.strataframe.net/Topic16090.aspx

By Bill Cunnien - 5/2/2008

Time to get some help on this.

I have a comboboxedit control that has a requery event taking three integer parameters.  The FillDataTable method in the BO looks like this:

public void FillByOrderIndex(int pPLType, int pMasterIndex, int pAddrIndex)
{
   
SqlParameter mPLType = new SqlParameter("@pltype", pPLType);
   
SqlParameter mMasterIndex = new SqlParameter("@masterindex", pMasterIndex);
   
SqlParameter mAddrIndex = new SqlParameter("@addrindex", pAddrIndex);
    FillByStoredProcedure(
"spx_GetOrderItemList", mPLType, mMasterIndex, mAddrIndex);
}

This actually works (thanks for the help earlier this week!).  The problem comes in when the combobox hits one of the resulting columns.  It is the "orderid" field.  It gets to the following code:

[
Browsable(false),
BusinessFieldDisplayInEditor(),
Description(""),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public System.Int32 orderid
{
   
get
   
{
       
return (System.Int32)this.CurrentRow["orderid"];  <--*** OFFENDING CODE ***
    }
   
set
   
{
       
this.CurrentRow["orderid"] = value;
    }
}

The get_orderid() method kicks out a "Specified cast is not valid" error.  If I place the parameters into the SQL Query Analyzer, I get a result set that does have an orderid and it is an integer value.

Any ideas about what I should do or where to look for a solution?

Thanks!!
Bill


By Greg McGuffey - 5/2/2008

Have you put a break point on that line and investigated what the value of this.CurrentRow["orderid"] is?
By Bill Cunnien - 5/2/2008

Yup...that is why this is so baffling...the loValue variable is reflecting the value of the integer field properly.  Yet, the stack trace shows that get_orderid method throws a specified cast is not valid error.

Scratches head (again).

By Bill Cunnien - 5/2/2008

Sorry...I changed the field to return a 0 on null, so the code looks like this, now:

[Browsable(false),
BusinessFieldDisplayInEditor(),
Description(""),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public System.Int32 orderid
{
    get
    {
        object loValue;
        loValue =
this.CurrentRow["orderid"];
        if (loValue == DBNull.Value)
        {
            return 0;
        }
        else
        {
            return (System.Int32)loValue;
        }
    }
    set
    {
        this.CurrentRow["orderid"] = value;
    }
}

By Greg McGuffey - 5/2/2008

This fixed it or this is what the code looks like now? I see nothing obviously wrong. The most likely problems are either the BO is empty (in which case CurrentRow is null) or the value of the field is DbNull.Value, which you're taking care of.
By Bill Cunnien - 5/2/2008

Still broken.

I am still trying to change one thing at a time to correct the problem (very time-consuming).  So far, no success.  Thanks for pitching in, Greg.  I am sure I did something wrong that is quite simple and easily overlooked.  I see a "Doh!" moment coming soon.

Bill

By Bill Cunnien - 5/2/2008

Here is the error report:

InvalidCastException
  Specified cast is not valid.

Source     : System

Stack Trace:
   at System.ComponentModel.ReflectPropertyDescriptor.SetValue(Object component, Object value)
   at System.Windows.Forms.Binding.SetPropValue(Object value)
   at System.Windows.Forms.Binding.PushData(Boolean force)
   at System.Windows.Forms.Binding.UpdateIsBinding()
   at System.Windows.Forms.Binding.CheckBinding()
   at System.Windows.Forms.Binding.SetListManager(BindingManagerBase bindingManagerBase)
   at System.Windows.Forms.ListManagerBindingsCollection.AddCore(Binding dataBinding)
   at System.Windows.Forms.BindingsCollection.Add(Binding binding)
   at System.Windows.Forms.BindingContext.UpdateBinding(BindingContext newBindingContext, Binding binding)
   at System.Windows.Forms.Control.UpdateBindings()
   at System.Windows.Forms.Control.OnBindingContextChanged(EventArgs e)
   at System.Windows.Forms.Control.OnParentBindingContextChanged(EventArgs e)
   at System.Windows.Forms.ContainerControl.OnCreateControl()
   at System.Windows.Forms.Form.OnCreateControl()
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl()
   at System.Windows.Forms.Control.WmShowWindow(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ContainerControl.WndProc(Message& m)
   at System.Windows.Forms.Form.WmShowWindow(Message& m)
   at System.Windows.Forms.Form.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)

By Greg McGuffey - 5/2/2008

Did you set the FieldPropertyDescriptor for this property?
By Bill Cunnien - 5/2/2008

Not exactly sure what you are talking about...sorry.  After you mentioned that, though, I went into the DDT and edited my (non-database) table.  I put a description in each column (same as the name).  Partial built and this is now the code in the BO for the orderid:

[Browsable(false),
BusinessFieldDisplayInEditor(),
Description("orderid"),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public System.Int32 orderid
{
   
get
   
{
       
object loValue;
        loValue =
this.CurrentRow["orderid"];
       
if (loValue == DBNull.Value)
        {
           
return 0;
        }
       
else
       
{
           
return (System.Int32)loValue;    <<--- BOMBS HERE!
        }
    }
   
set
   
{
       
this.CurrentRow["orderid"] = value;
    }
}

I am building and running now...stand by...

Btw, I blew away the combobox and added a grid, bo and bbs.  No matter what I do, the orderid bombs.

Here is the error:

System.InvalidCastException was unhandled by user code
  Message="Specified cast is not valid."
  Source="AspireModel"
  StackTrace:
       at Aspire.Model.OrderItemListBO.get_orderid() in C:\Aspire Projects\AspireSF\AspireModel\OrderItemListBO.Designer.cs:line 315
       at Aspire.Model.OrderItemListBO.Field_orderid_Descriptor.GetValue(Object component) in C:\Aspire Projects\AspireSF\AspireModel\OrderItemListBO.Designer.cs:line 575
       at DevExpress.Data.Helpers.BaseListDataControllerHelper.GetRowValue(Int32 listSourceRow, Int32 column)
       at DevExpress.Data.DataController.GetRowValue(Int32 controllerRow, Int32 column)
       at DevExpress.Data.BaseListSourceDataController.GetRowValue(Int32 controllerRow, Int32 column)
       at DevExpress.XtraGrid.Views.Base.ColumnView.GetRowCellValue(Int32 rowHandle, GridColumn column)
       at DevExpress.XtraGrid.Views.Grid.GridView.GetRowCellValue(Int32 rowHandle, GridColumn column)
       at DevExpress.XtraGrid.Views.Grid.ViewInfo.GridViewInfo.CalcRowCellDrawInfo(GridDataRowInfo ri, GridColumnInfoArgs ci, GridCellInfo cell, GridColumnInfoArgs nextColumn, Boolean calcEditInfo)
       at DevExpress.XtraGrid.Views.Grid.ViewInfo.GridViewInfo.CalcRowCellsDrawInfo(GridDataRowInfo ri, GridColumnsInfo columnsInfo)
       at DevExpress.XtraGrid.Views.Grid.ViewInfo.GridViewInfo.CalcDataRow(GridDataRowInfo ri, GridRow row, GridRow nextRow)
       at DevExpress.XtraGrid.Views.Grid.ViewInfo.GridViewInfo.CalcRowsDrawInfo()
       at DevExpress.XtraGrid.Views.Grid.ViewInfo.GridViewInfo.CalcGridInfo()
       at DevExpress.XtraGrid.Views.Grid.ViewInfo.GridViewInfo.Calc(Graphics g, Rectangle bounds)
       at DevExpress.XtraGrid.Views.Base.ColumnView.DoInternalLayout()
       at DevExpress.XtraGrid.Views.Base.ColumnView.CalculateLayout()
       at DevExpress.XtraGrid.Views.Grid.GridView.LayoutChanged()
       at DevExpress.XtraGrid.Views.Base.BaseView.EndUpdateCore(Boolean synchronized)
       at DevExpress.XtraGrid.GridControl.EndUpdate(Boolean synchronized)

By Greg McGuffey - 5/2/2008

Take a look at this post, you've got the property setup, just wondering if you also added the field property descriptors for any custom fields:



http://forum.strataframe.net/FindPost13027.aspx
By Bill Cunnien - 5/2/2008

I am defining the table in DDT, creating a BO, then pointing the BO to the table via the BOM.  These are derived fields from the DB, to be sure, but they are technically not custom.  I don't think I would need custom bindable property descriptors.  I'll take a look at this.
By Bill Cunnien - 5/2/2008

The BO isn't even completed with the data retrieval method and I get this:

orderid = 'this.orderid' threw an exception of type 'System.InvalidCastException'

The orderid field is set to INT.  The field that I am retrieving to fill the table is an INT, as well.  This is quite confusing.  I am going to blow away the table, the BO and the references on the form to the BO and start over.  I have been working on this for almost 6 hours.  I doubt starting from scratch will make any difference.  Unsure

Btw, I have confirmed that the stored procedure used to fill the table works perfectly.  An orderid is being returned that is an INT.

Confusing.
Bill

By Bill Cunnien - 5/2/2008

Added a watch to the variable loValue (which looked like it had a value).  It shows this:

loValue 0x0000000000004ff8 object {long}

Long?!?  The type ought to be Int.  Hmmmm.  Maybe I am on to something here...

By Bill Cunnien - 5/2/2008

The table in SQL Server has the orderid field defined as INT.  That field is selected in a stored procedure, like this:

SalesOrderMaster.orderid AS orderid

When I saw that the field was showing up in the BO as a LONG, I did this:

CAST(SalesOrderMaster.orderid AS int) AS orderid

Now, it works.  This is a SQL Server 2000 application.  Could anyone provide a reason for this kind of behavior?

Thanks!
Bill

By Trent L. Taylor - 5/5/2008

Now, it works.  This is a SQL Server 2000 application.  Could anyone provide a reason for this kind of behavior?

I would have to set this up on an SQL Server 2000 machine...but it was actually SQL Server passing it over as long...not the BO converting the value.  It has been a while since I lived in SQL Server 2000 as we only use 2005 (and soon 2008) any more in the field.  However, if I am not mistaken, I think that when a field was derived in SQL Server 2000 and it was not explicity defined in a variable or from an underlying field table, it always went the the larger of the values...in this case LONG (BIGINT) over INT.  I would have to get my head back into the older rules...but at any rate, I am glad you got it figured out.

Now you have my curiosity up...I will have to load a 2000 machine up and give it a go BigGrin

By Bill Cunnien - 5/5/2008

Thanks for the response.  I long to be on SQL Server 2008.  Our adoption of newer versions is a bit slow.  I did get authorization to obtain SS2008 for installation and migration later this summer.  I expect to be blown away by the improvements.  But, I also expect a good chunk of work getting all of the databases relocated.  It will be fun work, though!