lawso
asked on
ItemCommand not getting the correct value in DataGrid
I am trying to get the value of a DataGrid and using an ItemCommand update the value in the DataTable behind it.
I have this working but it sends the OLD value of the txQTY textbox.
Can someone help?
DATAGRID
<asp:DataGrid id="dg" runat="server" AutoGenerateColumns="False " BorderStyle="None" BorderWidth="1px" BorderColor="#3366CC" BackColor="White" CellPadding="4" OnDeleteCommand="dg_Delete Command" OnItemCommand="dg_ItemComm and">
<FooterStyle forecolor="#003399" backcolor="#99CCCC"></Foot erStyle>
<HeaderStyle font-bold="True" forecolor="#CCCCFF" backcolor="#003399"></Head erStyle>
<PagerStyle horizontalalign="Left" forecolor="#003399" backcolor="#99CCCC" mode="NumericPages"></Page rStyle>
<SelectedItemStyle font-bold="True" forecolor="#CCFF99" backcolor="#009999"></Sele ctedItemSt yle>
<ItemStyle forecolor="#003399" backcolor="White"></ItemSt yle>
<Columns>
<asp:TemplateColumn HeaderText="Product Name">
<ItemTemplate><asp:label id="Product_Name" text='<%# databinder.eval(container. dataitem, "Product_Name") %>' runat="server"></asp:label ></ItemTem plate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="Price">
<ItemTemplate>$<asp:label id="Product_Price" text='<%# databinder.eval(container. dataitem, "Product_Price") %>' runat="server"></asp:label ></ItemTem plate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="Size">
<ItemTemplate><asp:label id="Product_Size_Text" text='<%# databinder.eval(container. dataitem, "Product_Size_Text") %>' runat="server">
</asp:label></ItemTemplate >
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="Colour">
<ItemTemplate><asp:label id="Product_Colour_Text" text='<%# databinder.eval(container. dataitem, "Product_Colour_Text") %>' runat="server"></asp:label ></ItemTem plate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="QTY">
<ItemTemplate>
<EditItemTemplate>
<asp:TextBox id="txtQTY" text='<%# databinder.eval(container. dataitem, "Quantity") %>' maxlength="2" width="30" runat="server"></asp:TextB ox>
</EditItemTemplate>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="Amount">
<ItemTemplate>
<!--HIDDEN STUFF-->
<asp:label id="Gst_Excluded" text='<%# databinder.eval(container. dataitem, "Gst_Excluded") %>' runat="server" Visible="false"></asp:labe l>
<asp:label id="Product_Size" text='<%# databinder.eval(container. dataitem, "Product_Size") %>' runat="server" Visible="false"></asp:labe l>
<asp:label id="Product_Colour" text='<%# databinder.eval(container. dataitem, "Product_Colour") %>' runat="server" Visible="false"></asp:labe l>
</ItemTemplate>
</asp:TemplateColumn>
<asp:ButtonColumn Text="Remove" CommandName="Delete"></asp :ButtonCol umn>
<asp:ButtonColumn Text="Re-Calculate" CommandName="Recalculate"> </asp:Butt onColumn>
</Columns>
</asp:DataGrid>
ITEMCOMMAND
Protected Sub dg_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls. DataGridCo mmandEvent Args)
Select Case e.CommandName
Case "Recalculate"
'Dim newQTY As Integer = CType(e.Item.FindControl(" txtQTY"), TextBox).Text
Dim newQTY As Integer = CType(e.Item.FindControl(" txtQTY"), TextBox).Text
Response.Write(newQTY)
shopping_cart.AddToCart(Me .txtPRODID .Text, Me.txtPRODNAME.Text, Me.txtPRODPRICE.Text, Me.ddlSIZES.SelectedItem.T ext, Me.ddlSIZES.SelectedValue, Me.ddlCOLOURS.SelectedItem .Text, Me.ddlCOLOURS.SelectedValu e, newQTY, Me.txtGST_INCLUDED.Text)
If Page.IsPostBack = True Then
dg.DataBind()
End If
End Select
End Sub
I have this working but it sends the OLD value of the txQTY textbox.
Can someone help?
DATAGRID
<asp:DataGrid id="dg" runat="server" AutoGenerateColumns="False
<FooterStyle forecolor="#003399" backcolor="#99CCCC"></Foot
<HeaderStyle font-bold="True" forecolor="#CCCCFF" backcolor="#003399"></Head
<PagerStyle horizontalalign="Left" forecolor="#003399" backcolor="#99CCCC" mode="NumericPages"></Page
<SelectedItemStyle font-bold="True" forecolor="#CCFF99" backcolor="#009999"></Sele
<ItemStyle forecolor="#003399" backcolor="White"></ItemSt
<Columns>
<asp:TemplateColumn HeaderText="Product Name">
<ItemTemplate><asp:label id="Product_Name" text='<%# databinder.eval(container.
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="Price">
<ItemTemplate>$<asp:label id="Product_Price" text='<%# databinder.eval(container.
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="Size">
<ItemTemplate><asp:label id="Product_Size_Text" text='<%# databinder.eval(container.
</asp:label></ItemTemplate
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="Colour">
<ItemTemplate><asp:label id="Product_Colour_Text" text='<%# databinder.eval(container.
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="QTY">
<ItemTemplate>
<EditItemTemplate>
<asp:TextBox id="txtQTY" text='<%# databinder.eval(container.
</EditItemTemplate>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="Amount">
<ItemTemplate>
<!--HIDDEN STUFF-->
<asp:label id="Gst_Excluded" text='<%# databinder.eval(container.
<asp:label id="Product_Size" text='<%# databinder.eval(container.
<asp:label id="Product_Colour" text='<%# databinder.eval(container.
</ItemTemplate>
</asp:TemplateColumn>
<asp:ButtonColumn Text="Remove" CommandName="Delete"></asp
<asp:ButtonColumn Text="Re-Calculate" CommandName="Recalculate">
</Columns>
</asp:DataGrid>
ITEMCOMMAND
Protected Sub dg_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.
Select Case e.CommandName
Case "Recalculate"
'Dim newQTY As Integer = CType(e.Item.FindControl("
Dim newQTY As Integer = CType(e.Item.FindControl("
Response.Write(newQTY)
shopping_cart.AddToCart(Me
If Page.IsPostBack = True Then
dg.DataBind()
End If
End Select
End Sub
Why have you added txtQTY under <EditTemplate> ? Should'nt it be in <ItemTemplate> itself.
Secondly, I assume that when you call shopping_cart.AddToCart it changes the underlying datasource so you need to reassign new data (or datasource) to datagrid before databind().
and
' If Page.IsPostBack = True Then 'You don't have to check IsPostback ItemCommand will only call during IsPostBack
dg.DataSource = dt
dg.DataBind()
'End If
Secondly, I assume that when you call shopping_cart.AddToCart it changes the underlying datasource so you need to reassign new data (or datasource) to datagrid before databind().
and
' If Page.IsPostBack = True Then 'You don't have to check IsPostback ItemCommand will only call during IsPostBack
dg.DataSource = dt
dg.DataBind()
'End If
This is correct what lawso has did
I think txtQTY will have the value when datagrid is for EDIT mode
so Edited value in txtQTY will assign as new value
I think txtQTY will have the value when datagrid is for EDIT mode
so Edited value in txtQTY will assign as new value
The ItemTemplate simply displays the value of the DataSource field this column is to display,
while the EditItemTemplate creates a TextBox Web control for the user to edit the data.
while the EditItemTemplate creates a TextBox Web control for the user to edit the data.
Reply to SystemExpert:
i know what EditItemTemplate is for, only reason i aasked this is because i don't see any handler where the EditItemIndex is being set.
Question to Origianal Poster.
<EditItemTemplate> will only show TextBox when a EditItemIndex of the datagrid will be set to datagridrowindex which needs to be edited. And you can edit only one row at a time. what i would like to know is where are you setting the EditItemIndex for the datagrid.
This is what is my understanding.
You Datagrid is actually used to display ShoppingCart and every row has QTY text box. Which user changes and Recalculates based on new quantity in the Itemcommand handler..
i know what EditItemTemplate is for, only reason i aasked this is because i don't see any handler where the EditItemIndex is being set.
Question to Origianal Poster.
<EditItemTemplate> will only show TextBox when a EditItemIndex of the datagrid will be set to datagridrowindex which needs to be edited. And you can edit only one row at a time. what i would like to know is where are you setting the EditItemIndex for the datagrid.
This is what is my understanding.
You Datagrid is actually used to display ShoppingCart and every row has QTY text box. Which user changes and Recalculates based on new quantity in the Itemcommand handler..
ASKER
I was assuming that the DataGriid handled all of the creation of unique ID's etc.
I was also assuming that the Re-Calculate would recalculate for that DataRow only.
Am I wrong?
When I click Re-Calculate it goes to the ItemCommand function no problems, it just can't find txtQTY in the DataRow.
How would this normally be handled?
How do I set the EditItemIndex?
your help is appreciated.
I was also assuming that the Re-Calculate would recalculate for that DataRow only.
Am I wrong?
When I click Re-Calculate it goes to the ItemCommand function no problems, it just can't find txtQTY in the DataRow.
How would this normally be handled?
How do I set the EditItemIndex?
your help is appreciated.
If you will put the textbox in <ItemTemplate> it will work. (I assume that you want to display textbox for all the rows (shopping cart item) in the datagrid.
In case you are interested in Inline Editing with Datagrid.
Inline Editing generally works as per row basis. You have to add following tag
<asp:EditCommandColumn runat="server" HeaderText="Edit" EditText="Edit" UpdateText="OK" CancelText="Cancel"></asp: EditComman dColumn>
Also handle follwing events:
OnEditCommand, OnUpdateCommand, OnCancelCommand.
In the OnEditCommand Handler
grid.EditItemIndex = e.Item.ItemIndex;
//Binddata again
After this the text box will be displayed with Update and cancel link.
Then accordingly you write code for Update and Cancel handler.
In case you are interested in Inline Editing with Datagrid.
Inline Editing generally works as per row basis. You have to add following tag
<asp:EditCommandColumn runat="server" HeaderText="Edit" EditText="Edit" UpdateText="OK" CancelText="Cancel"></asp:
Also handle follwing events:
OnEditCommand, OnUpdateCommand, OnCancelCommand.
In the OnEditCommand Handler
grid.EditItemIndex = e.Item.ItemIndex;
//Binddata again
After this the text box will be displayed with Update and cancel link.
Then accordingly you write code for Update and Cancel handler.
ASKER
Maybe I am missing something here because I can get the code working, but it is picking up the old value of txtQTY. Regardless of whether I am refreshing the DG correctly
This seems to be the root of my problem and I can't see why.
If I have:
- Two rows wach with a different txtQTYvalue
- I change the txtQTY value on one row
- I click on re-Calculate
It finds the right txtQTY but it sets the value to the OLD value that I have overtyped.
What am I missing in this process.
I can find txtQTY but it has the old version
I now have the txtQTY insid eonly the <ItemTemplate> only and it is doing the same thing
This seems to be the root of my problem and I can't see why.
If I have:
- Two rows wach with a different txtQTYvalue
- I change the txtQTY value on one row
- I click on re-Calculate
It finds the right txtQTY but it sets the value to the OLD value that I have overtyped.
What am I missing in this process.
I can find txtQTY but it has the old version
I now have the txtQTY insid eonly the <ItemTemplate> only and it is doing the same thing
Is it updating the correct value and then displaying the old value.
did you change the databind code.
dg.datasource = <datasource> //It should refresh with the new data
dg.DataBind()
did you change the databind code.
dg.datasource = <datasource> //It should refresh with the new data
dg.DataBind()
ASKER
This is my code ... from what I can see I am not doing anything to the DataSource.
Protected Sub dg_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls. DataGridCo mmandEvent Args)
Select Case e.CommandName
Case "Recalculate"
Dim newQTY As Integer = CType(e.Item.FindControl(" txtQTY"), TextBox).Text
'Dim newQTY As Integer = e.Item.FindControl("txtQTY ").text
Response.Write(newQTY)
shopping_cart.AddToCart(Me .txtPRODID .Text, Me.txtPRODNAME.Text, Me.txtPRODPRICE.Text, Me.ddlSIZES.SelectedItem.T ext, Me.ddlSIZES.SelectedValue, Me.ddlCOLOURS.SelectedItem .Text, Me.ddlCOLOURS.SelectedValu e, newQTY, Me.txtGST_INCLUDED.Text)
If Page.IsPostBack = True Then
dg.DataBind()
End If
End Select
End Sub
Protected Sub dg_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.
Select Case e.CommandName
Case "Recalculate"
Dim newQTY As Integer = CType(e.Item.FindControl("
'Dim newQTY As Integer = e.Item.FindControl("txtQTY
Response.Write(newQTY)
shopping_cart.AddToCart(Me
If Page.IsPostBack = True Then
dg.DataBind()
End If
End Select
End Sub
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Wow I am an amateur....
I was reseting the DataTable from a Session variable on page load.
A simple IF NOT PAGE.ISPOSTBACK THEN has done the trick.
Thanks to everyone for participating... I have given active agent the points for perserving with me and points me to the Page Load
I was reseting the DataTable from a Session variable on page load.
A simple IF NOT PAGE.ISPOSTBACK THEN has done the trick.
Thanks to everyone for participating... I have given active agent the points for perserving with me and points me to the Page Load
Thanks ..It was a pleasure to help you!
If Page.IsPostBack = True Then
dg.DataSource = ds // where ds is your datasource so fill it again here
dg.DataBind()
End If
Thanks & Regards