Link to home
Start Free TrialLog in
Avatar of Victor  Charles
Victor CharlesFlag for United States of America

asked on

Help with saving data to Datatable and displaying data in listbox

Hi,

I am using the code below to include data in a Datatable to display in a listbox, problem is
eventhough the dta is found in two records (part B), my DataTable contains 5 rows instead
of two rows, apparently I am getting a row for each natch but I need a row for each record. Based on data in Part B, my Datatable should contain:

Row1 102,104,105
Row2 102,104

Instead I am getting
Row1 102,
Row2 104
Row3 105
Row4 102
Row5 104


The code below gives me the following error:

"Complex DataBinding accepts as a data source either an IList or an IListSource."

For example if C1Ctry.SelectedValue.ToString = 1
For Each xnLink As Xml.XmlNode In xdLink.SelectNodes("/Root/LinkA[Ctry_ID='" & C1Ctry.SelectedValue.ToString & "']")
            Link_ID = xnLink.SelectSingleNode("LinkAID").InnerText

‘Retreive data

  For Each xnNSN As Xml.XmlNode In xdNSN.SelectNodes("/Root/NSNTable[contains('," & NSNID & ",', concat(',', NSN_ID, ','))]")
                NSNID2 = xnNSN.SelectSingleNode("NSN_ID").InnerText
                Name = xnNSN.SelectSingleNode("NSN").InnerText
                dtNSN.Rows.Add({NSNID2, Name})
                utubeNSN = "," & Name
            Next

          ‘Display data
C1NSN.Items.Clear()
C1NSN.DataSource = dtNSN.Rows(0) ' Error
 C1NSN.DisplayMember = "NSN"
 C1NSN.ValueMember = "NSN_ID"
Next


Part B
<LinkA>
    <LinkAID>1</LinkAID>
    <crty_ID>1</ctry_ID>
       <NSN_ID>1,2,5</NSN_ID>
      </LinkA>
<LinkA>
    <LinkAID>2</LinkAID>
    <ctry_ID>1</ctry_ID>
     <NSN_ID>1,2</NSN_ID>
     </LinkA>


How do I modify the code to obtain the data in the right number of rows and How do I move to the next row to display the right record?

Thanks,

Victor
ASKER CERTIFIED SOLUTION
Avatar of Miguel Oz
Miguel Oz
Flag of Australia image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of Victor  Charles

ASKER

Hi,
C1NSN.DisplayMember  is = NSN and C1NSN.ValueMember NSN_ID. I would like to use a datatable to store multiple rows (one row per record) to be able to use Next and Prvious buttons to move through the rows. Probloem is when I use C1NSN.DataSource = dtNSN I get
all rows, but I only one to display the first row in the listbox, the other problem is, the code is returning 5 rows, when it should only return two rows as explained in my initial post.

How do I only see one row for each record? as shown in part B I only have two records, but the  datatable contains 5 rows.

Thanks,

V.
Hi,

Below is the code that worked with the web version. How do I replace session in the Windows version?

 Public Function SearchCtry()

  Dim xdNSN As New Xml.XmlDocument
  xdNSN.Load(Server.MapPath("~/App_DataA/NSN.xml"))
  Dim fuze_Nsn_id As String
  Dim NSNID As String
  Dim NSNID2 As String
 
  dtMaster.Columns.Add("NSN_ID", GetType(String))
  dtMaster.Columns.Add("NSN", GetType(String))


  dtKeyMaster = New DataTable
  dtKeyMaster.Columns.Add("rowId", GetType(String))
  dtKeyMaster.Columns.Add("keyLinkAid", GetType(String))
  dtKeyMaster.Columns.Add("keyNsn", GetType(String))

  Dim rowIndex As Integer = 1

    For Each xnLink As Xml.XmlNode In xdLink.SelectNodes("/Root/LinkA[Ctry_ID='" & C1ctry.SelectedItem.Value & "']")

NSNID = xnLink.SelectSingleNode("NSN_ID").InnerText
fuze_Nsn_id = NSNID
LinkAID = Link_ID

            'For Listbox
            For Each xnNSN As Xml.XmlNode In xdNSN.SelectNodes("/Root/NSNTable[contains('," & NSNID & ",', concat(',', NSN_ID, ','))]") 'NSN.xml
                NSNID2 = xnNSN.SelectSingleNode("NSN_ID").InnerText
                If dtMaster.Select("NSN_ID in (" & NSNID2 & ")").Length = 0 Then
                    Name = xnNSN.SelectSingleNode("NSN").InnerText
                    dtMaster.Rows.Add({fuze_Nsn_id, LinkAID, NSNID2, Name})
                End If
            Next

   dtMaster.AcceptChanges()
   dtKeyMaster.Rows.Add({rowIndex, LinkAID, fuze_Nsn_id, NSSIda})
   rowIndex += 1

 Next


  Session("dtMaster") = dtMaster
  Session("dtKeyMaster") = dtKeyMaster
  ViewDataB(dtKeyMaster.Rows(0)(1), dtKeyMaster.Rows(0)(2))

End Function


Private Sub ViewDataB(ByVal keyLinkAid As String, ByVal keyNsn As String)

  Dim _table As DataView = dtMaster.DefaultView
  _table.RowFilter = "NSN_ID in (" & keyNsn & ")"
  C1NSN.DataSource = _table
 C1NSN.DataTextField = "NSN"
 C1NSN.DataValueField = "NSN_ID"
C1NSN.DataBind()
End Sub
Below is the code i used in the web  version to move to the next row in the table, how do i replace Session in the Windows version?

        dtMaster = Session("dtMaster")
        dtKeyMaster = Session("dtKeyMaster")
        Dim rowId As Integer = Session("currentIndex") + 1
        ViewDataB(dtKeyMaster.Rows(rowId)(1), dtKeyMaster.Rows(rowId)(2))

I am also using the code below for datafield to move to the next row for datafields not using dtmaster but MyRowIndex can not replace Session.

 MyRowIndex = If(MyRowIndex < dtDonor.Rows.Count - 1, MyRowIndex + 1, MyRowIndex)
        C1CountryOrigin.Text = dtDonor.Rows(MyRowIndex).Item("Country")
Hi,

I was able to move to the next row using the following code:

  ViewDataB(dtKeyMaster.Rows(MyRowIndex)(1), dtKeyMaster.Rows(MyRowIndex)(2))

Any ideas on how to move to first and last row?


Thanks,

V.
Issue is resolved. Thanks.