Solved

Multiplying Columns in a DataGrid

Posted on 2004-10-04
33
507 Views
Last Modified: 2008-03-17
Please help!  What I want to do is SO simple, but getting information on anything other than a simple DataGrid seems impossible.

I am setting up a datagrid for a shopping cart, with the item and its amount populated from the database, no problem.  I want to add two template columns, one with a textbox control, defaulted to 1, for the quantity, and another with a label that displays the amount x qty.  The next step will be to add an update button so that if the user changes the quantity, they can update the total amount.  I just cant seem to work out how to display the total for each line when the grid loads - any clues?

If anyone knows of any good resources that go beyond standard data controls and explains how to programmatically control them, please let me know!!

Thanks
0
Comment
Question by:BlueEdger
  • 14
  • 11
  • 6
  • +1
33 Comments
 
LVL 1

Author Comment

by:BlueEdger
ID: 12220851
PS - Im coding in VB.NET
0
 
LVL 15

Assisted Solution

by:praneetha
praneetha earned 50 total points
ID: 12220899
you can write cod ein itemdatabound

and access what is in a datagrid row using e.Item.Cells[0].Text-would give first column..

TextBox txt=(TextBox)e.Item.cells[0].FindControl("textboxname");//sorry this is C#...
txt.Text- contains the updated quantity...

0
 
LVL 1

Author Comment

by:BlueEdger
ID: 12220930
I have a function that loads the datagrid with no arguments.  Therefore e is not available to me in this function, so should I do the multiplication in a new function?
0
Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
LVL 17

Accepted Solution

by:
AerosSaga earned 75 total points
ID: 12220950
I would add a template column and make an itemdatabound subroutine to handle the OnItemDataBound event (put OnItemDataBound="DataGrid1_ItemDataBound" in the HTML source between the datagrid tags

Each time a row is added, it will call this subroutine and you can do math with each cell of the row(item)

    Protected Sub DataGrid1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles DataGrid1.ItemDataBound
         'assuming template column will be column #7 and the dropdown list is column 5 and the quantity is column 6
         e.item.cells(7).text = CStr(CDbl(e.item.cells(6).text) * CDbl(CType(e.item.cells(5).controls(0) ,DropDownList).SelectedItem.Text)
    End Sub

Aeros
0
 
LVL 15

Expert Comment

by:praneetha
ID: 12220993
r u adding datagrid dynamically....

item databound is executed adter datagrid is bound....

0
 
LVL 17

Expert Comment

by:AerosSaga
ID: 12220996
0
 
LVL 1

Author Comment

by:BlueEdger
ID: 12221076
AerosSaga - I've tried the following:

    Protected Sub dgTest2_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles dgTest2.ItemDataBound
        e.Item.Cells(1).Text = CStr(CDbl(e.Item.Cells(0).Text) * CDbl(e.Item.Cells(3).Text))
    End Sub

Had to remove the dropdown ref, as I havent got one, qty is in cell 0 and amount is in 3, amount is supplied by the db, is that why I am getting the following error:

Input string was not in a correct format
0
 
LVL 17

Expert Comment

by:AerosSaga
ID: 12221108
what happens if you try this:

 e.Item.Cells(1).Text = CDbl(e.Item.Cells(0).Text) * CDbl(e.Item.Cells(3).Text))
0
 
LVL 1

Author Comment

by:BlueEdger
ID: 12221132
No, same error
0
 
LVL 17

Expert Comment

by:AerosSaga
ID: 12221152
check the quick watch for those two expressions and see what values you are getting
0
 
LVL 1

Author Comment

by:BlueEdger
ID: 12221168
I think the problem is with the quantity.  I've just put make cell 1 the text of cell 0 or 3, and it does it for amount but not for quantity.  It also changes the title of cell 1 to the other column?
0
 
LVL 17

Expert Comment

by:AerosSaga
ID: 12221170
You may need to create intermediary variables in double like

Dim Mydbl2 As Double = CDbl(e.Item.Cells(0).Text)
Dim Mydbl2 As Double = CDbl(e.Item.Cells(3).Text)

then multiply your two variables and write it back out as a string to your datagrid cell
0
 
LVL 17

Expert Comment

by:AerosSaga
ID: 12221184
check your ordinals then, are there invisible columns?
0
 
LVL 1

Author Comment

by:BlueEdger
ID: 12221226
Can I stop it trying to do the calculation on the header row?
0
 
LVL 17

Expert Comment

by:AerosSaga
ID: 12221256
why are you trying to do it in the header anyway?
0
 
LVL 1

Author Comment

by:BlueEdger
ID: 12221264
It just wont recognise the contents of the textbox in Cells(0).  I've put an if statement in so it only does the calculation if cells(0).text <> qty (the title of the column)
0
 
LVL 17

Expert Comment

by:AerosSaga
ID: 12221267
If you want the in the header/footer check here:
http://aspnet.4guysfromrolla.com/articles/020503-1.aspx

Aeros
0
 
LVL 1

Author Comment

by:BlueEdger
ID: 12221286
Im not trying to do it in the header!!!!!  So why is it trying to calculate the header?  Here is my datagrid:

<asp:DataGrid id="dgTest2" runat="server" Font-Size="10px" Font-Names="Arial" CellPadding="2" OnItemDataBound="dgTest2_ItemDataBound">
<HeaderStyle Font-Size="11px" Font-Bold="True"></HeaderStyle>
<Columns>
<asp:TemplateColumn HeaderText="Qty">
<ItemTemplate>
      <asp:TextBox id="qty" runat="server" Columns="10">2</asp:TextBox>
</ItemTemplate>
</asp:TemplateColumn>
      <asp:TemplateColumn HeaderText="SubTotal">
      <ItemTemplate>
      <asp:Label Runat="server" ID="subtotal"></asp:Label>
      </ItemTemplate>
      </asp:TemplateColumn>
</Columns>

The other columns are greated dynamically.  Is that the problem?  Because I have a mixture of columns?
0
 
LVL 17

Expert Comment

by:AerosSaga
ID: 12221297
Yes it is
0
 
LVL 17

Expert Comment

by:AerosSaga
ID: 12221305
are you recreating said dynamic columns on postback?
0
 
LVL 1

Author Comment

by:BlueEdger
ID: 12221312
Havent got as far as postback, at the moment just have binddata function and then this itemdatabound function on page load.  
0
 
LVL 1

Author Comment

by:BlueEdger
ID: 12221319
Im going to change it to bound columns
0
 
LVL 15

Expert Comment

by:praneetha
ID: 12221347
  Protected Sub dgTest2_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles dgTest2.ItemDataBound

if  e.Item.ItemType != ListItemType.Header && e.Item.ItemType != ListItemType.Footer// do this

        e.Item.Cells(1).Text = CStr(CDbl(e.Item.Cells(0).Text) * CDbl(e.Item.Cells(3).Text))
    End Sub
0
 
LVL 1

Author Comment

by:BlueEdger
ID: 12221357
I just cant get the value of the textbox.  Is it not e.Item.cells(0).Text if its in a textbox?
0
 
LVL 15

Expert Comment

by:praneetha
ID: 12221369
TextBOx textbox1=(TextBOx)e.Item.cells(0).FindControl("Textboxname");

try that...and access...using textbox1.text
0
 
LVL 1

Author Comment

by:BlueEdger
ID: 12221387
In VB?
0
 
LVL 15

Expert Comment

by:praneetha
ID: 12221403
just however you would typecast in VB...
0
 
LVL 15

Expert Comment

by:praneetha
ID: 12221427
Dim I As TextBox = DirectCast(e.Item.cells(0).FindControl("Textboxname"), TextBox)

may be like that

or

Dim I As TextBox = CType(e.Item.cells(0).FindControl("Textboxname"), TextBox)
0
 
LVL 1

Author Comment

by:BlueEdger
ID: 12221507
Have to go now, thanks for your help guys, will continue with this tomorrow
0
 
LVL 15

Expert Comment

by:Thogek
ID: 12221582
Sounds like praneetha has the idea.  To attempt to translate his suggestion to VB:

    If Not e.Item.ItemType = ListItemType.Header  And  Not e.Item.ItemType = ListItemType.Footer Then
        ' current Item is not a header or footer row
        e.Item.Cells(1).Text = CStr( CDbl(e.Item.Cells(0).Text) * CDbl(e.Item.Cells(3).Text) )
    End If

or, more directly

    If e.Item.ItemType = ListItemType.Item  Or  e.Item.ItemType = ListItemType.AlternatingItem Then
        ' current Item is an Item or AlternatingItem
        e.Item.Cells(1).Text = CStr( CDbl(e.Item.Cells(0).Text) * CDbl(e.Item.Cells(3).Text) )
    End If
0
 
LVL 1

Author Comment

by:BlueEdger
ID: 12224880
OK, looking at this fresh this morning, I seem to have got there at last!!

This seems to have worked:

    Protected Sub dgTest2_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles dgTest2.ItemDataBound
        If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
            ' current Item is an Item or AlternatingItem
            Dim l As Label = CType(e.Item.Cells(1).Controls(1), Label)
            l.Text = CStr(Integer.Parse((CType(e.Item.Cells(0).Controls(1), TextBox)).Text) * CDbl(e.Item.Cells(3).Text))
        End If
    End Sub

This proved a good source on the subject:

http://www.dotnetjunkies.com/Tutorial/FF3A910D-17C0-464D-AB47-89A98C5D1355.dcik

I need to refine it for formatting etc, but the base functionality works.  Phew!  Is all of .NET this hard??  Im pining for Classic ASP!!!

All of the books I have on .NET only touch on standard data controls, and dont go into the nitty gritty of programmatically setting them.  If anyone knows of a good reference book that will help me with this, please let me know - Im desperate for help!!!

Thanks for all your help guys - I'll leave the question open a bit longer in case there is anything to add to this subject, then award points.  
0
 
LVL 17

Expert Comment

by:AerosSaga
ID: 12225787
Its not always this hard, you just had very specific requirements for a prefab control.  Once you get the hang of it, its imeasurably easier, and less time consuming than Classic ASP

Aeros
0
 
LVL 15

Expert Comment

by:Thogek
ID: 12229892
> Is all of .NET this hard??  

ASP.NET involves a lot more structure (and thus more stuff to learn) than "classic" ASP, but once you get oriented within all that structure, some things do indeed become easier, and you may find yourself with easier ways to do much more powerful things....

Of course, that's all subjective.  (YMMV, and all that. :-)

> If anyone knows of a good reference book

There are lots of ASP.NET books out there.  Personally, I don't like most of the ones I've seen, 'cause most of 'em gloss over the details of the ASP.NET-to-HTML relationship and many other details which I consider rather important.

My favorite so far has been http://www.amazon.com/exec/obidos/ASIN/0789728222/tgk-20 (whether interested in pursuing the MCAD/MCSD or not) -- but again, this is *very* subjective.  If you're interested in a good book, I'd suggest camping out in your local bookstore(s) and going through as many candidates as you can find until you find one that *you* like.
0

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Problem to refer to value 8 62
Please explain purpose of GZIP 4 35
using CK editor in iframes 5 18
asp.net mvc 2 23
In .NET 2.0, Microsoft introduced the Web Site.  This was the default way to create a web Project in Visual Studio 2005.  In Visual Studio 2008, the Web Application has been restored as the default web Project in Visual Studio/.NET 3.x The Web Si…
Introduction This article shows how to use the open source plupload control to upload multiple images. The images are resized on the client side before uploading and the upload is done in chunks. Background I had to provide a way for user…
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit https://www.mail-signatures.com/articles/signature-templates/?sts=6651 If you want to manage em…

838 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question