Solved

ASP.Net 2.0 Gridview Inside a Gridview (Parent/Child)

Posted on 2006-11-20
13
957 Views
Last Modified: 2008-01-09
I have a gridview that returns the following results pulled from Table1:

ID
100
______________________
200
______________________
300
______________________

I need to add a column called 'Staff' that lists the names of people associated with the ID.  The staff names are in Table2.  Table1 and Table2 are linked by ID.

ID     Staff_Name
100   Joe Smith
        Jane Doe
________________________________
200    Bob Jones
         May Kay
________________________________
300   Alice Rite
        Lori Jones
        Al Johnson



How do I modify the following code to add the Staff column?

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="AccessDataSource1">
            <Columns>
                <asp:BoundField DataField="ID" HeaderText="ID" SortExpression="ID" />
            </Columns>
        </asp:GridView>
        <asp:AccessDataSource ID="AccessDataSource1" runat="server" DataFile="~/mydb.mdb"
            SelectCommand="SELECT [ID] FROM [Table1]"></asp:AccessDataSource>

Thanks for your help!
0
Comment
Question by:drees727
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
13 Comments
 
LVL 9

Expert Comment

by:kraffay
ID: 17983440
Here's a good example, it just uses a objectdatasource instead of the AccessDataSource.  

http://www.vbdotnetheaven.com/UploadFile/nikhil_be_it/GridViewInsideGridView05232006004636AM/GridViewInsideGridView.aspx
0
 
LVL 15

Expert Comment

by:Solar_Flare
ID: 17984664
the best way would be to change your query for the datasource so that it pulls the data from both tables at once

eg SELECT Table1.ID, Table2.Staff_Name FROM table1, table2 WHERE Table2.Staff_ID=table1.ID
0
 

Author Comment

by:drees727
ID: 17988847
Solar Flare - That won't work because I'd end up with the same record listed more than once.

kraffay - I looked at the code in your link and tried to dwindle it down since I'm not doing any editing or updating.  This is what I've ended up with but it's not pulling in the names.  Any suggestions?

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataIDNames="ID" DataSourceID="Accessdatasource1" >
            <Columns>
                <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True" SortExpression="ID" >
                </asp:BoundField>
                <asp:TemplateField HeaderText="Staff">
                    <ItemTemplate>
                        <asp:GridView ID="Gridview2" runat="server" AutoGeneratecolumns="True" DataIDNames="ID" DataSourceID="Accessdatasource2" >
                        </asp:GridView>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>

     <asp:AccessDataSource ID="AccessDataSource1" runat="server" DataFile="mydb.mdb"
            SelectCommand="SELECT [ID] FROM [Table1]"></asp:AccessDataSource>
           
         <asp:AccessDataSource ID="AccessDataSource2" runat="server" DataFile="mydb.mdb"
            SelectCommand="SELECT [Name], [ID] FROM [TABLE2] Where ID = @ID">
           
        <SelectParameters>
          <asp:ControlParameter ControlID="GridView1" Name="ID" Type="String" />
        </SelectParameters>      
            </asp:AccessDataSource>
0
Instantly Create Instructional Tutorials

Contextual Guidance at the moment of need helps your employees adopt to new software or processes instantly. Boost knowledge retention and employee engagement step-by-step with one easy solution.

 
LVL 9

Expert Comment

by:kraffay
ID: 17989044
Do you code to handle the OnRowDatabound event of the the Parent Grid?  This is where you set the Select param of the child's data source
0
 

Author Comment

by:drees727
ID: 17990151
I don't have any OnRowDatabound event.  Apparently that's where I'm lost.  Help!  
0
 
LVL 9

Expert Comment

by:kraffay
ID: 17990694
You need something like this:

Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound

        Dim objListItem As DataControlRowState

        objListItem = e.Row.RowState

        Dim intMAsterID1 As Integer

        If e.Row.RowType = DataControlRowType.DataRow Then

            Dim grd As GridView

            If objListItem = DataControlRowState.Normal Or objListItem = DataControlRowState.Alternate Then

            grd = CType(e.Row.FindControl("Gridview2"), GridView)

            If grd IsNot Nothing Then

                grd.DataSourceID = ""

                grd.DataSource = ChildDataSource

                Dim intMAsterID1 As Integer

                MAsterID1 = Convert.ToInt32(CType(e.Row.DataItem, DataRowView).Row.ItemArray(0).ToString())

                AccessDataSource2.SelectParameters("ID").DefaultValue = intMAsterID1

                AccessDataSource2.Select()

                grd.DataBind()

            End If

        End If

      End If

End Sub

0
 

Author Comment

by:drees727
ID: 17991331
Ok.  Bear with me.  I'm new at this.  I'm getting a 'Type datarowview is not defined' error.  Here is what I have now.  Assuming Master table ID is called 'ID1' and Child table ID is called 'ID2'.
****************************************************    

Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
        Dim objListItem As DataControlRowState
        objListItem = e.Row.RowState
        Dim intMAsterID1 As Integer
        If e.Row.RowType = DataControlRowType.DataRow Then
            Dim grd As GridView
            If objListItem = DataControlRowState.Normal Or objListItem = DataControlRowState.Alternate Then
                grd = CType(e.Row.FindControl("Gridview2"), GridView)
                If grd IsNot Nothing Then
                    grd.DataSourceID = ""
                    grd.DataSource = AccessDataSource2
                    Dim Key As Integer
                    ID1 = Convert.ToInt32(CType(e.Row.DataItem, DataRowView).Row.ItemArray(0).ToString())
                    intMAsterID1 = ID1
                    AccessDataSource2.SelectParameters("ID1").DefaultValue = intMAsterID1
                    AccessDataSource2.Select()
                    grd.DataBind()
                End If
            End If
        End If
    End Sub

My Gridview page:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="ID1" DataSourceID="Accessdatasource1" >
            <Columns>
                <asp:BoundField DataField="ID1" HeaderText="ID1" InsertVisible="False" ReadOnly="True" SortExpression="ID1" >
                </asp:BoundField>
                <asp:TemplateField HeaderText="Staff">
                    <ItemTemplate>
                        <asp:GridView ID="Gridview2" runat="server" AutoGeneratecolumns="False" DataKeyNames="ID2" DataSourceID="Accessdatasource2" >
            <Columns>
                                <asp:BoundField DataField="ID2" HeaderText="ID2" InsertVisible="False" ReadOnly="True" SortExpression="ID2" />
                                <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
            </Columns>
                        </asp:GridView>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>

     <asp:AccessDataSource ID="AccessDataSource1" runat="server" DataFile="mydb.mdb"
            SelectCommand="SELECT [ID1] FROM [Table1]"></asp:AccessDataSource>
           
         <asp:AccessDataSource ID="AccessDataSource2" runat="server" DataFile="mydb.mdb"
            SelectCommand="SELECT [Name], [ID2] FROM [Table2] Where ID2 = @ID1">
           
            <SelectParameters>
                <asp:Parameter Name="ID1" Type="Int32" />
            </SelectParameters>    
            </asp:AccessDataSource>
0
 
LVL 9

Expert Comment

by:kraffay
ID: 17991403
Try replace this line:

ID1 = Convert.ToInt32(CType(e.Row.DataItem, DataRowView).Row.ItemArray(0).ToString())

With this:

Dim dr as DataRowView = CType(e.Row.DataItem, DataRowView)
ID1 = Convert.ToInt32(dr("ID"))

Make sure you can compile before you try to run the app.

Good Luck!

http://www.integrityconsulting.net/blog/
0
 

Author Comment

by:drees727
ID: 17991701
That fixed that line but now I'm getting "Argument not specified for paramater arguments of Public Function..." on this line:

AccessDataSource2.Select()
0
 
LVL 9

Expert Comment

by:kraffay
ID: 17991851
Sorry, you're close, but I would have take your data and recreate your scenario to get this working.  Try taking another look at the sample.
0
 

Author Comment

by:drees727
ID: 18031834
I couldn't get the above sample to work.  I'm using the following to accomplish what I need.  Everying is working well now.
http://www.codeproject.com/useritems/SkinSample.asp
0
 
LVL 1

Accepted Solution

by:
DarthMod earned 0 total points
ID: 18461973
PAQed with points refunded (125)

DarthMod
Community Support Moderator
0

Featured Post

On Demand Webinar: Networking for the Cloud Era

Ready to improve network connectivity? Watch this webinar to learn how SD-WANs and a one-click instant connect tool can boost provisions, deployment, and management of your cloud connection.

Question has a verified solution.

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

Today is the age of broadband.  More and more people are going this route determined to experience the web and it’s multitude of services as quickly and painlessly as possible. Coupled with the move to broadband, people are experiencing the web via …
ASP.Net to Oracle Connectivity Recently I had to develop an ASP.NET application connecting to an Oracle database.As I am doing it first time ,I had to solve several problems. This article will help to such developers  to develop an ASP.NET client…
There are cases when e.g. an IT administrator wants to have full access and view into selected mailboxes on Exchange server, directly from his own email account in Outlook or Outlook Web Access. This proves useful when for example administrator want…
Monitoring a network: why having a policy is the best policy? Michael Kulchisky, MCSE, MCSA, MCP, VTSP, VSP, CCSP outlines the enormous benefits of having a policy-based approach when monitoring medium and large networks. Software utilized in this v…

705 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