Hi,
Any Ideas what is causing this error?
As far as I can tell everything in instatiated.
Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
Private Sub dgOrdersCarriages_UpdateCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles dgOrdersCarriages.UpdateCommand
Dim dropSerialNumber As DropDownList
Dim SerialNumber As Integer
Dim StockItemID As Integer
Dim OrderDetailID As Integer = dgOrdersCarriages.DataKeys(e.Item.ItemIndex)
dropSerialNumber = CType(e.Item.FindControl("ddlstAvailableCarriages"), DropDownList)
StockItemID = dropSerialNumber.SelectedItem.Value
SerialNumber = dropSerialNumber.SelectedItem.Text
End SubAre you sure that this statement dropSerialNumber = CType(e.Item.FindControl("ddlstAvailableCarriages"), DropDownList) actually instantiates the dropSerialNumber object. You should put a check after this statement to check if dropSerialNumber is actually initializaed or not.
Yes on debugging it is getting instatiated but it looks like it isnt getting the values selected?
I dont know whats going wrong?
Check to make sure that dropSerialNumber.SelectedItem is "something" first... I suspect that maybe the root of the problem.
-tg
Yeah I would just check the ItemIndex first, and if it was -1, I would either set some defaults or default to the first item in the DDL.
Can you show me what you mean. Code below.
As you can see the Original dropdown box is populated from a returned datatable and displays and works as it should.
I agree that the selected index is showing -1 but cannot understand why??
<asp:datagrid id="dgOrdersCarriages" runat="server" AutoGenerateColumns="False" AllowPaging="True">
<Columns>
<asp:EditCommandColumn ButtonType="LinkButton" UpdateText="Update" CancelText="Cancel" EditText="Edit"></asp:EditCommandColumn>
<asp:BoundColumn Visible="False" DataField="PK_StockOrderDetailID" ReadOnly="True"></asp:BoundColumn>
<asp:BoundColumn Visible="False" DataField="FK_StockModelID" ReadOnly="True"></asp:BoundColumn>
<asp:BoundColumn DataField="StockModel" ReadOnly="True" HeaderText="Stock Model"></asp:BoundColumn>
<asp:BoundColumn DataField="Hand" ReadOnly="True" HeaderText="Hand"></asp:BoundColumn>
<asp:TemplateColumn HeaderText="Stock Serial No">
<ItemTemplate>
<asp:Label id=Label1 runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.FK_StockItemID") %>'>
</asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList id=dropAvailableCarriages DataValueField="PK_StockItemID" DataTextField="StockSerialNumber" DataSource="<%# PopulateAvailableCarriages %>" Runat="server">
</asp:DropDownList>
</EditItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn DataField="FK_AssignmentStatus" ReadOnly="True" HeaderText="Assignment Status"></asp:BoundColumn>
</Columns>
<PagerStyle Mode="NumericPages"></PagerStyle>
</asp:datagrid><asp:datagrid id="dgOrdersRails" runat="server" AllowPaging="True">
<PagerStyle Mode="NumericPages"></PagerStyle>
</asp:datagrid><asp:datagrid id="dgOrdersPlatforms" runat="server" AllowPaging="True">
<PagerStyle Mode="NumericPages"></PagerStyle>
</asp:datagrid></div>
Private Sub dgOrdersCarriages_UpdateCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles dgOrdersCarriages.UpdateCommand
Dim dropAvailableCarriages As DropDownList
Dim SerialNumber As Integer
Dim StockItemID As Integer
Dim OrderDetailID As Integer = dgOrdersCarriages.DataKeys(e.Item.ItemIndex)
dropAvailableCarriages = CType(e.Item.FindControl("dropAvailableCarriages"), DropDownList)
StockItemID = dropAvailableCarriages.SelectedItem.Value
SerialNumber = dropAvailableCarriages.SelectedItem.Text
End Sub
This line returns the correct value
Dim OrderDetailID As Integer = dgOrdersCarriages.DataKeys(e.Item.ItemIndex)
It seems just the Dropdown isnt returning a value or selected index.
they mean, if there is no selected item, it will return nothing
Private Sub dgOrdersCarriages_UpdateCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles dgOrdersCarriages.UpdateCommand
Dim dropAvailableCarriages As DropDownList
Dim SerialNumber As Integer
Dim StockItemID As Integer
Dim OrderDetailID As Integer = dgOrdersCarriages.DataKeys(e.Item.ItemIndex)
dropAvailableCarriages = CType(e.Item.FindControl("dropAvailableCarriages"), DropDownList)
If Not dropAvailableCarriages.SelectedItem Is Nothing Then
StockItemID = dropAvailableCarriages.SelectedItem.Value
SerialNumber = dropAvailableCarriages.SelectedItem.Text
Else
'Nothing selected, do some error handling
End If
End Sub
The problem seems to be because clicking the Update Link causes a postback which re-fills the combo box hence nothing is selected. Is there a way to stop this happening?
C#:
if(dropAvailableCarriages.Items.Length == 0) {//Fill Drop Down; }
(Hence skipping a filling of items if it was already filled)
I can't do that because the DropDownList is only accessible fro the FindControl method of tyhe datagrid because it is a template column.
I think the problem stems from the Update Click calling a post back and running the Page Load event before the Update_Command thus rebinding the grid. see below. I really cannot see a way round this because it is a details (master/detail) form and needs to be populated on load.
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Put user code to initialize the page here
OrderID = Request.QueryString("id")
If IsNothing(OrderID) Then
Response.Redirect("ViewOrders.aspx")
End If
Me.lblOrderID.Text = OrderID
Main.objStockOrder.GetOrderDetails(OrderID)
Me.dgOrdersCarriages.DataSource = Main.objStockOrder.dds_Orders.dt_StockOrdersDetailsCarriages
Me.dgOrdersCarriages.DataKeyField = "PK_StockOrderDetailID"
Me.dgOrdersCarriages.DataBind()
Me.dgOrdersRails.DataSource = Main.objStockOrder.dds_Orders.dt_StockOrdersDetailsRails
Me.dgOrdersRails.DataBind()
Me.dgOrdersPlatforms.DataSource = Main.objStockOrder.dds_Orders.dt_StockOrdersDetailsPlatforms
Me.dgOrdersPlatforms.DataBind()
End Sub
What I cant understand is why clicking the Update button column of the grid causes the page load event to fire before the Update_command.
If you turn the datagrid to EnableViewState = "true" you should not have to rebind it every time you post back... It should retain all the values it had, including custom controls and what was selected about them.
That part works fine now but I now get this error when I try co come out of edit mode.
Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.
Private Sub dgOrdersCarriages_CancelCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles dgOrdersCarriages.CancelCommand
' Me.dgOrdersCarriages.EditItemIndex = -1
Me.dgOrdersCarriages.DataSource = Main.objStockOrder.dds_Orders.dt_StockOrdersDetailsCarriages
Me.dgOrdersCarriages.DataKeyField = "PK_StockOrderDetailID"
Me.dgOrdersCarriages.DataBind()
Me.dgOrdersCarriages.EditItemIndex = -1
End Sub
Fixed :D
Private Sub dgOrdersCarriages_CancelCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles dgOrdersCarriages.CancelCommand
Me.dgOrdersCarriages.EditItemIndex = -1
Me.dgOrdersCarriages.DataSource = Main.objStockOrder.dds_Orders.dt_StockOrdersDetailsCarriages
Me.dgOrdersCarriages.DataKeyField = "PK_StockOrderDetailID"
Me.dgOrdersCarriages.DataBind()
End Sub
Private Sub dgOrdersCarriages_UpdateCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) Handles dgOrdersCarriages.UpdateCommand
'Dim dropAvailableCarriages As DropDownList
Dim SerialNumber As Integer
Dim StockItemID As Integer
Dim OrderDetailID As Integer = dgOrdersCarriages.DataKeys(e.Item.ItemIndex)
Dim dropAvailableCarriages As DropDownList
dropAvailableCarriages = CType(e.Item.FindControl("dropAvailableCarriages"), DropDownList)
StockItemID = dropAvailableCarriages.SelectedItem.Value
SerialNumber = dropAvailableCarriages.SelectedItem.Text
Me.dgOrdersCarriages.EditItemIndex = -1
Me.dgOrdersCarriages.DataSource = Main.objStockOrder.dds_Orders.dt_StockOrdersDetailsCarriages
Me.dgOrdersCarriages.DataKeyField = "PK_StockOrderDetailID"
Me.dgOrdersCarriages.DataBind()
End Sub
Subscribe to:
Post Comments (Atom)
0 comments:
Post a Comment