I have created a web form with a Parent div container that contains child divs based on an SQL query. The number of children is based on the number of rows in the query result. I am hitting a snag though, and I think it's because I am programmatically adding a script as the divs are created. I know the script works because I tested it. It just isn't firing for the dynamically created divs.
Here is what the code looks like in the child div. It works, but not on dynamically created divs.
Sub ThumbView()
lbl_Status.Text = "ThumbView"
ListPanel.Visible = False
Dim MyTable As String = "[Estimate_Info4]"
Dim Sql As String = "SELECT* FROM [Estimate_Info4]"
Dim dbConnection = New SqlConnection(connString)
Dim dbCommand = New SqlCommand(Sql, dbConnection)
Dim data As New SqlDataAdapter(dbCommand)
Dim table As New DataTable(MyTable)
Dim rowIndex As Integer = 0
'//////////Open Database Connection////////////
dbConnection.Open()
data.Fill(table)
'//////////Loop through Data & Create Div for each Record //////////////
For Each row As DataRow In table.Rows
For i As Integer = 0 To (table.Rows.Count - 1)
Try
rowIndex = i
'/////////////////Control Delcarations/////////////////////
Dim NumberName As String = CStr(table.Rows(rowIndex)("EstNumber")) & " " & CStr(table.Rows(rowIndex)("JobName"))
Dim CleanName As String = RemoveWhitespace(NumberName)
Dim LBL_EstId As Label = New Label
Dim LBL_EstNumber As Label = New Label
Dim LBL_EstName As Label = New Label
Dim LBL_EstAddress1 As Label = New Label
Dim LBL_EstAddress2 As Label = New Label
Dim LineBreak As HtmlGenericControl = New System.Web.UI.HtmlControls.HtmlGenericControl("br")
Dim LineBreak1 As HtmlGenericControl = New System.Web.UI.HtmlControls.HtmlGenericControl("br")
Dim LineBreak2 As HtmlGenericControl = New System.Web.UI.HtmlControls.HtmlGenericControl("br")
Dim LineBreak3 As HtmlGenericControl = New System.Web.UI.HtmlControls.HtmlGenericControl("br")
Dim LineBreak4 As HtmlGenericControl = New System.Web.UI.HtmlControls.HtmlGenericControl("br")
Dim LineBreak5 As HtmlGenericControl = New System.Web.UI.HtmlControls.HtmlGenericControl("br")
Dim div As HtmlGenericControl = New HtmlGenericControl("div")
Dim divleft As HtmlGenericControl = New HtmlGenericControl("div")
Dim divright As HtmlGenericControl = New HtmlGenericControl("div")
Dim MyScript As HtmlGenericControl = New HtmlGenericControl("Script")
Dim MyIMG As ImageButton = New ImageButton
Dim MyIMG2 As ImageButton = New ImageButton
Dim RecID As Integer = (table.Rows(rowIndex)("Id"))
Dim RecID2 As String = CStr(table.Rows(rowIndex)("Id"))
'/////////////////Add 1st Child Div//////////////////
div.Attributes.Add("runat", " = server")
div.Style.Add("Class", "test")
div.Style.Add("width:", "637px")
div.Style.Add("height:", "228px")
div.Style.Add("aria-multiline", "True")
div.Style.Add("font-family", "verdana")
div.Style.Add("aria-multiline", "True")
div.Style.Add("word-break", "break-all")
div.Style.Add("word-wrap", "break-word")
div.Style.Add("Padding", "100x")
div.Style.Add("Border", "thick solid #666666")
div.Style.Add("margin-bottom", "10px")
div.Style.Add("margin-top", "10px")
div.Style.Add("margin-right", "10px")
div.Style.Add("margin-left", "10px")
div.Style.Add("display", "inline-grid")
Panel1.Style.Add("display", "inherit")
Panel1.Controls.Add(div)
'/////////////////Add 1st Child to First Child Div Float Left to house Image//////////////////
Dim StartString As String = "<script language=" & Chr(34) & "vb" & Chr(34) & "runat=" & Chr(34) & "server" & Chr(34) & ">" & Chr(10)
Dim EndString As String = "Sub ImageBttn" & RecID & "_Click(sender As Object, e As ImageClickEventArgs) Handles ImageBttn" & RecID & ".Click" & Chr(10) &
"Dim JobName As String = ImageBttn" & RecID & ".DescriptionUrl" & Chr(10) & "Dim JobID As String = ImageBttn" & RecID2 & ".CommandName" & Chr(10) &
"Response.Redirect(String.Format(" & Chr(34) & "~/476.aspx?JobName={0}&JobID={1}" & Chr(34) & ", JobName, JobID))" & Chr(10) & "End Sub" '& Chr(10) & "</script>"
' Dim inputString As String = EndString.Replace((Char)34),"").ToString()
'MsgBox(StartString & EndString)
Dim Q As String = Chr(34).ToString
Dim aString As String = Q & "~/476.aspx?JobName={0}&JobID={1}" & Q & ", JobName, JobID))"
Dim mymsg As String = "You Clicked" & NumberName
Dim folderPath As String = Server.MapPath("~/Files/VBScripts/")
Dim Mypath As String = folderPath & CleanName & ".vbs"
Try
'Check whether Directory (Folder) exists.
If Not Directory.Exists(folderPath) Then
'If Directory (Folder) does not exists Create it.
Directory.CreateDirectory(folderPath)
End If
'Save the File to the Directory (Folder).
'Dim Path As String = Server.MapPath("~/Files/VBScripts/")
Dim fs As FileStream = File.Create(Mypath)
' Add text to the file.
Dim info As Byte() = New UTF8Encoding(True).GetBytes(EndString)
fs.Write(info, 0, info.Length)
fs.Close()
Catch ex As Exception
MsgBox("Something has gone wrong..." & vbNewLine & ex.Message)
End Try
MyIMG.Style.Add("ID", CleanName)
MyIMG.Style.Add("Runat", "server")
MyIMG.Style.Add("OnClick", "ImageBttn" & RecID & "_Click")
MyIMG.Style.Add("DiscriptionUrl", NumberName)
MyIMG.Style.Add("CommandName", RecID2)
MyIMG.Style.Add("Class", "inner")
' /////////////// Create VBScript File and Add to Div////////////////
MyScript.Attributes.Add("script language", "vb")
MyScript.Attributes.Add("runat", "server")
MyScript.Attributes.Add("src", MyPath)
' src="
divleft.Attributes.Add("runat", " = server")
divleft.Style.Add("Class", "inner")
divleft.Style.Add("width: ", "186px")
divleft.Style.Add("height:", "228px")
divleft.Style.Add("aria-multiline", "True")
divleft.Style.Add("font-family", "verdana")
divleft.Style.Add("aria-multiline", "True")
divleft.Style.Add("Padding", "100x")
divleft.Style.Add("Border", "1px Gray")
divleft.Style.Add("Float", "Right")
divleft.Style.Add("display", "inline-Block")
divleft.Controls.Add(MyScript)
div.Controls.Add(divleft)
'/////////////////Add 2nd Child to First Child Div Float Right to house Labels//////////////////
divright.Attributes.Add("runat", " = server")
divright.Style.Add("Class", "inner")
divright.Style.Add("width:", "351px")
divright.Style.Add("height:", "228px")
divright.Style.Add("aria-multiline", "True")
divright.Style.Add("font-family", "verdana")
divright.Style.Add("aria-multiline", "True")
divright.Style.Add("Padding", "100x")
divright.Style.Add("Border", "1px Gray")
divright.Style.Add("Float", "Left")
divright.Style.Add("display", "inline")
div.Controls.Add(divright)
'/////////////////Add Controls to all of the Children//////////////////
MyIMG.Style.Add("ID", CleanName)
MyIMG.Style.Add("Runat", "server")
MyIMG.Style.Add("DiscriptionUrl", NumberName)
MyIMG.Style.Add("CommandName", RecID2)
MyIMG.Style.Add("Class", "inner")
MyIMG.Style.Add("OnClick", "ImageBttn" & RecID & "_Click")
divleft.Controls.Add(MyIMG)
MyIMG.ImageUrl = "~/Images/BLDG1.jpg"
LBL_EstNumber.Style.Add("runat", "server")
LBL_EstNumber.Style.Add("Height", "21px")
LBL_EstNumber.Style.Add("Width", "266px")
LBL_EstNumber.Style.Add("Font-Names", "Verdana")
LBL_EstNumber.Style.Add("Font-Size", "medium")
LBL_EstNumber.Style.Add("Font-Bold", "True")
LBL_EstNumber.Style.Add("ForeColor", "#666666")
LBL_EstNumber.Text = Chr(10) & " " & CStr(table.Rows(rowIndex)("EstNumber")) & " "
divright.Controls.Add(LineBreak1)
divright.Controls.Add(LBL_EstNumber)
LBL_EstNumber.Font.Bold = True
LBL_EstName.Style.Add("runat", "server")
LBL_EstName.Style.Add("Height", "21px")
LBL_EstName.Style.Add("Width", "266px")
LBL_EstName.Style.Add("Font-Names", "Verdana")
LBL_EstName.Style.Add("Font-Size", "medium")
LBL_EstName.Style.Add("Font-Bold", "True")
LBL_EstName.Style.Add("ForeColor", "#666666")
LBL_EstName.Text = Chr(10) & " " & CStr(table.Rows(rowIndex)("JobName")) & " "
divright.Controls.Add(LineBreak2)
divright.Controls.Add(LBL_EstName)
LBL_EstName.Font.Bold = True
LBL_EstAddress1.Style.Add("runat", "server")
LBL_EstAddress1.Style.Add("Height", "21px")
LBL_EstAddress1.Style.Add("Width", "266px")
LBL_EstAddress1.Style.Add("Font-Names", "Verdana")
LBL_EstAddress1.Style.Add("Font-Size", "Small")
LBL_EstAddress1.Style.Add("ForeColor", "666666")
LBL_EstAddress1.Text = CStr(table.Rows(rowIndex)("JobAddress"))
divright.Controls.Add(LineBreak3)
divright.Controls.Add(LBL_EstAddress1)
LBL_EstAddress2.Style.Add("runat", "server")
LBL_EstAddress2.Style.Add("Height", "21px")
LBL_EstAddress2.Style.Add("Width", "266px")
LBL_EstAddress2.Style.Add("Font-Names", "Verdana")
LBL_EstAddress2.Style.Add("Font-Size", "Small")
LBL_EstAddress2.Style.Add("ForeColor", "666666")
LBL_EstAddress2.Text = CStr(table.Rows(rowIndex)("JobCity")) & ", " & CStr(table.Rows(rowIndex)("JobState")) & " " & CStr(table.Rows(rowIndex)("JobZipCode"))
divright.Controls.Add(LBL_EstAddress2)
divright.Controls.Add(LineBreak4)
MyIMG2.Style.Add("runat", "server")
divright.Controls.Add(MyIMG2)
Dim EstStatus As Integer = (table.Rows(rowIndex)("EstimateStatus"))
If EstStatus = 2 Then MyIMG2.ImageUrl = "~/Images/Loss.jpg"
If EstStatus = 3 Then MyIMG2.ImageUrl = "~/Images/Awarded.jpg"
If EstStatus = 1 Then MyIMG2.ImageUrl = "~/Images/Pending.jpg"
Catch Ex As Exception
MsgBox("We've encountered an error; " & Ex.Message)
End Try
Next
Next
'/////////////////unhide the parent//////////////
Panel1.Style.Add("Height", "800px")
Panel1.Style.Add("width", "1800px")
Panel1.Style.Add("overflow", "scroll")
Panel1.Style.Add("overflow-y", "Scroll")
Panel1.Style.Add("overflow-x", "scroll")
Panel1.Visible = True
End Sub
'end result
<asp:ImageButton ID="ImageButton4" runat="server" ImageUrl="~/Images/BLDG1.jpg" OnClientClick="ImageButton4_Click" DescriptionUrl="EST 02 Concrete Superstructure Hotel" EnableTheming="True" />
<script language="vb" runat="server">
Sub ImageButton4_Click(sender As Object, e As ImageClickEventArgs) Handles ImageButton4.Click
Dim JobName As String = ImageButton4.DescriptionUrl
Dim JobID As String = ImageButton4.CommandName
Response.Redirect(String.Format("~/476.aspx?JobName={0}&JobID={1}", JobName, JobID))
End Sub
</script>
I would not write all that code to inject repeating data into a web page. It not only too much code, but then after you done that, then trying to pluck out, or have the user operate against a given row of data is too much work.
I suggest you create ONE thing, lay it out correct in the desinger, and then simply feed it data.
So, say we have this:
So create the "one thing", lay it out nice. style it - do whatever. The result is simple, no code, use markup - you are done.
Now, look how easy it now becomes to "repeat" the data over and over with this code:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
' load the Repeater
LoadData
End If
End Sub
Sub LoadData()
Using cmdSQL As SqlCommand = New SqlCommand("SELECT * FROM tblHotels ORDER BY HotelName",
New SqlConnection(My.Settings.TEST3))
cmdSQL.Connection.Open()
Repeater1.DataSource = cmdSQL.ExecuteReader
Repeater1.DataBind()
End Using
End Sub
Output:
Now, was that not oh so easy? And then we can add css, get fancy, and improve that grid, but NOT have to touch the code behind!!!
And now, it becomes SUPER easy to deal with one thing. For example, we have that button click in the div. Lets get the row clicked, get the database PK id, and lets shove that into a label FOR THE ONE repeater item.
The code is thus this:
Protected Sub cmdTest_Click(sender As Object, e As EventArgs)
' btn click
Dim btn As Button = sender
Dim rRow As RepeaterItem = btn.Parent
Dim str As String = "Row Clicked = " & rRow.ItemIndex & " (PK ID = " & btn.Attributes.Item("PKID") & ")<br/>"
Dim txtHotel As TextBox = rRow.FindControl("txtHotel")
str &= "Hotel name = " & txtHotel.Text
' now setup label
Dim lbl As Label = rRow.FindControl("Label1")
lbl.Text = str
End Sub
I mean, how easy was that? So if we click on the 3nd one, we see this:
So, put your repeating stuff into of al things a "repeater".
Note how easy, how clean, how little code was written, and yet we get amazing ability here.
So, I recommend that you move out your code from the vb side, put it into a single nice layout, and then just shove data into that repeater - and it will "repeat" the data for you over and over.
Don't hard code all that markup in VB - it too much work, too hard, and costs too much time to get things done.
Edit:
So we use this code to load:
Sub LoadData()
Using cmdSQL As SqlCommand = New SqlCommand("SELECT * FROM tblHotels ORDER BY HotelName",
New SqlConnection(My.Settings.TEST3))
cmdSQL.Connection.Open()
Dim rst As New DataTable
rst.Load(cmdSQL.ExecuteReader)
Repeater1.DataSource = rst
Repeater1.DataBind()
End Using
End Sub
We used a datatable - since we need it later.
Now our row data bind event to change the status button is this:
Protected Sub Repeater1_ItemDataBound(sender As Object, e As RepeaterItemEventArgs) Handles Repeater1.ItemDataBound
Select Case e.Item.ItemType.ToString
Case "Item", "AlternatingItem"
Dim btnImage As ImageButton = e.Item.FindControl("cmdStatus")
Select Case e.Item.DataItem("Status")
Case 1
btnImage.ImageUrl = "Content/ok.png"
Case 2
btnImage.ImageUrl = "Content/ckdelete.png"
Case 3
End Select
Case "Footer"
End Select
End Sub
our markup is this:
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<div style="float:left;width:auto;border:solid;border-width:2px;padding:15px;margin-right:20px;border-radius:25px;box-shadow: 5px 5px #888888">
<div style="text-align:center">
<img src="Content/Skyline.PNG" />
<br />
<asp:Label ID="txtHotel" runat="server" Text='<%# Eval("HotelName") %>'></asp:Label>
<br />
<asp:Label ID="txtAD" runat="server" Text='<%# Eval("Address") %>'></asp:Label>
<br />
Active :<asp:CheckBox ID="Active" runat="server" Checked ='<%# Eval("Active") %>'></asp:CheckBox>
<asp:Button ID="cmdTest" runat="server" Text="Row Click" OnClick="cmdTest_Click"
PKID = '<%# Eval("ID") %>'
/>
<br />
<div style="float:left">
<asp:ImageButton ID="cmdStatus" runat="server" ImageUrl="Content/ok.png" Height="20px" Width="20px"/>
</div>
</div>
<asp:Label ID="Label1" runat="server" Text=""></asp:Label>
</div>
</ItemTemplate>
</asp:Repeater>
Output:
The beauty of above? We can now click on that button, or even the lower left check box - and we now have a simple event button code behind to grab that row - we can now show or launch another page based on clicking on each item.
Note how it took me less then 5 minutes to change my layout - that's because I am NOT writing code to do that layout and the mark-up part. So it was super easy for me to change the layout - even adding the graphic image.
OK, I'm going another route and the code is not firing.
I know there are easier ways to do this- So I'm adding a photo of webapps thumb view-there is also a list view view with icons indicating status. All I need now is the code to fire-It shows up on the page when I inspect.
![webform view]: (https://1drv.ms/u/s!AmmK5IyEVLSlg9gQSd_eb5KzA8UVcg?e=8sSdvI)
` Try
Dim csName As [String] = "ClientScript" & RecID
Dim csType As Type = divleft.[GetType]()
Dim cs As ClientScriptManager = Page.ClientScript
If Not cs.IsClientScriptBlockRegistered(csType, csName) Then
Dim csText As New StringBuilder()
csText.Append("<script language=" & Chr(34) & "vb" & Chr(34) & "runat=" & Chr(34) & "server" & Chr(34) & ">")
csText.Append("Sub ImageBttn" & RecID & "_Click(sender As Object, e As ImageClickEventArgs) Handles ImageBttn" & RecID & ".Click" & Chr(10) &
"Dim JobName As String = ImageBttn" & RecID & ".DescriptionUrl" & Chr(10) & "Dim JobID As String = ImageBttn" & RecID2 & ".CommandName" & Chr(10) &
"Response.Redirect(String.Format(" & Chr(34) & "~/476.aspx?JobName={0}&JobID={1}" & Chr(34) & ", JobName, JobID))" & Chr(10) &
"msgbox(ImageBttn" & RecID & ".DescriptionUrl)" & Chr(10) & "End Sub" & Chr(10) & "</script>")
cs.RegisterClientScriptBlock(csType, csName, csText.ToString())
End If
Catch ex As Exception
MsgBox("Something has gone wrong..." & vbNewLine & ex.Message)
End Try``
I have onclick button and when i debug,i found that my onclick value is NULL.Anyone Know why it cant get value for Onclick event.
Dim HTMLForm As New StringBuilder
HTMLForm.Append("<html>")
HTMLForm.AppendLine("<body onload='document.forms[""" & "form1" & """].submit()'>")
HTMLForm.AppendLine("<form id='form1' method='POST'>" )
'Set value to collection
SetRequestField("amount", CDec(lblTtlPayAmt.Text))
'Generate HTML content using collection
For Each kvp As KeyValuePair(Of String, String) In RequestFields
If Not String.IsNullOrEmpty(kvp.Value) Then
HTMLForm.AppendLine("<input type='hidden' id='" & kvp.Key & "' name='" & kvp.Key & "' value='" & kvp.Value & "' />")
End If
Next
HTMLForm.AppendLine("<input type = 'submit' value=PayNow' onclick = '" & window.open("~/Payment/Payment.aspx") & "'/>")
HTMLForm.AppendLine("</form>")
HTMLForm.AppendLine("</body>")
HTMLForm.AppendLine("</html>")
Response.Clear()
Response.Write(HTMLForm.ToString())
You have a missing ' on the line which adds the submit button:
HTMLForm.AppendLine("<input type = 'submit' value=PayNow' ....
should be
HTMLForm.AppendLine("<input type = 'submit' value='PayNow' ....
i have the problem, that i create a TextBox via vb.net Code while the programm ist running.
Private Sub GenerateTBSourcePath()
'Generiert eine neue leere Textbox
Dim tBox As System.Web.UI.WebControls.TextBox = New System.Web.UI.WebControls.TextBox()
tBox.Width = 400
Dim tbID As Integer = tbSourcePathID + 1
tBox.ID = "tbSourcePath_" + tbID.ToString()
pSourcePath.Controls.Add(tBox)
End Sub
When i try to search for the TextBox on pSourcePath i cant find any TextBox.
Have anyone an idea what do i wrong?
i add the TextBox in start of my programm. I can see the TextBox also in the Browser. When i want to save the Text i cant find the TextBox.
Private Sub SaveTBox()
'Für jede TBox den Eintrag in der DB aktualisieren oder einen neuen Eintrag anlegen
For Each PControl As System.Web.UI.Control In pSourcePath.Controls
Dim Controltype As String = PControl.GetType().FullName
Select Case Controltype
Case "System.Web.UI.WebControls.TextBox"
Dim tBox As WebControls.TextBox = CType(PControl, WebControls.TextBox)
If CheckExists(tBox.ID) = True
'Update
Administration_DataSource.UpdateCommand = "Update di_source set PATH = '" & tBox.Text & "' where TBID = '" & tBox.ID & "'"
Administration_DataSource.Update()
Else
'Insert
tbSourcePathID = tbSourcePathID + 1
Administration_DataSource.InsertCommand = "Insert Into di_source(ID, PATH, TBID) values('" & tbSourcePathID & "', '" & tBox.Text & "', '" & tBox.ID & "')"
Administration_DataSource.Insert()
End If
End Select
Next
End Sub
I tried this code
int tbSourcePathID = 0;
TextBox tBox = new TextBox();
PlaceHolder pSourcePath = new PlaceHolder();
tBox.Width = 400;
int tbID = tbSourcePathID + 1;
tBox.ID = "tbSourcePath_" + tbID.ToString();
pSourcePath.Controls.Add(tBox);
foreach (System.Web.UI.Control PControl in pSourcePath.Controls)
{
string Controltype = PControl.GetType().FullName;
switch (Controltype)
{
case "System.Web.UI.WebControls.TextBox":
bool here = true;
break;
}
}
and it works. Maybe the problem is in CheckExists(). Remember also the use of FindControl()
I am trying to process this json document using JSON.NET.
With the VB.NET code:
Dim o As JObject = JObject.Parse(json)
Dim results As List(Of JToken) = o.Children().ToList
Dim count As Integer = 0
For Each item As JProperty In results
Dim snippet As String = String.Empty
Dim URL As String = String.Empty
Dim source As String = String.Empty
item.CreateReader()
Select Case item.Name
Case "response"
snippet = item.Last.SelectToken("docs").First.Item("snippet").ToString
URL = item.Last.SelectToken("docs").First.Item("web_url").ToString
source = ControlChars.NewLine & "<font size='2'>" & item.First.SelectToken("docs").First.Item("source").ToString & "</font>" & ControlChars.NewLine
tbNews.Text &= "<a href=" & URL & " target='new'>" & snippet & "</a> - " & source
End Select
Next
I am only receiving the first document as a result. Can someone advise as to how I can get the 1st - Nth documents as a complete list?
The docs are 2 levels deep, you're only looping in the top level. Try this...
Dim parsedObject = JObject.Parse(json)
Dim docs = parsedObject("response")("docs")
For Each doc In docs
Dim snippet As String = doc("snippet")
Dim URL As String = doc("web_url")
Dim source As String = doc("source")
'....
Next
My XML comes in like this:
<Document type="ContentPage">
<Fields>
<Field name="FaqCategory" type="dropdown" title="Select Category:" index="FaqCategory" list="\Lists\FaqCategory" required="true">
Online Experience
</Field>
<Field name="FaqSubCategory" type="dropdown" title="Select Sub Category" list="\Lists\FaqSubCategory" required="true">
Using the site
</Field>
<Field name="FaqQuestion" type="text" title="Enter FAQ Question:" required="true">
How do I find articles on the site?
</Field>
<Field name="FaqAnswer" type="richtext" title="Enter FAQ Answer:" editorProfile="Advanced" required="true">
Answer to: How do I find articles on the site?
</Field>
</Fields>
<Placeholders />
<Indexes />
These are all in an array of XML objects, I need to sort through the array and set up (obviously) a FAQ section for this site. The problem I am having is that since this is not 1 xml document but a collection of xml documents, I am having a hard time sorting/separating by Main category > Sub category.
Here is where I am so far with the getting of the main categories:
Protected Sub getFaqData(ByVal DocArray() As CMSWS.CMSDocumentRecord)
Dim mainFaqCategoryItem As String = ""
Dim mainCategoryList As New List(Of String)
For Each Doc As CMSWS.CMSDocumentRecord In DocArray
xml.LoadXml(Doc.Xml)
Try
mainFaqCategoryItem = CType(xml.SelectSingleNode("//Fields/Field[#name='FaqCategory']").InnerText, String)
If Not mainCategoryList.Contains(mainFaqCategoryItem) Then
mainCategoryList.Add(mainFaqCategoryItem)
End If
Catch ex As Exception
Response.Write("ERROR getting the main category")
End Try
Next
For Each item In mainCategoryList
outputsubs(item, DocArray)
Next
End Sub
Here is the start of getting the sub categories and where I am stuck:
Protected Sub outputsubs(ByVal item As String, ByVal DocArray() As CMSWS.CMSDocumentRecord)
Dim subFaqCategoryItem As String = ""
Dim subcategoryList As New List(Of String)
'Add the main Category to the HTML output:
lblFaq.Text = lblFaq.Text & "<h1>" & item & "</h1>"
For Each Doc As CMSWS.CMSDocumentRecord In DocArray
xml.LoadXml(Doc.Xml)
Try
'If xml.SelectSingleNode("//Fields/Field[#name='FaqCategory']").InnerText = item Then
subFaqCategoryItem = CType(xml.SelectSingleNode("//Fields/Field[#name='FaqCategory']").InnerText, String)
If Not subcategoryList.Contains(subFaqCategoryItem) Then
subcategoryList.Add(subFaqCategoryItem)
End If
'End If
Catch ex As Exception
Response.Write("ERROR getting the main category")
End Try
Next
For Each subItem In subcategoryList
lblFaq.Text += "<h2><a name=""subCategory"" style=""text-decoration:none;""><span class=""FAQPlusMinus""> + </span>" & subItem & "</a></h2>"
Next
End Sub
My thinking is that I will need to set up for-each loops nested to about 3 levels to get this to work, but I can't get my brain around it. Especially since it isn't a single XML document.
Which works to display the main categories
I found the solution with trial and error, not sure if anyone else will be dealing with a similar situation but here is how I got it to work:
Protected Sub outputFaqData(ByVal DocArray() As CMSWS.CMSDocumentRecord)
Dim mainFaqCategoryItem As String = ""
Dim mainCategoryList As New List(Of String)
Dim xmlDocText As New StringBuilder()
xmlDocText.Append("<Documents>")
For Each cmsDoc As CMSWS.CMSDocumentRecord In DocArray
xmlDocText.Append(cmsDoc.Xml)
Next
xmlDocText.Append("</Documents>")
Dim doc As New XmlDocument()
doc.LoadXml(xmlDocText.ToString())
Dim nav As XPathNavigator = doc.CreateNavigator()
Dim exp As XPathExpression = nav.Compile("//Documents/Document/Fields")
exp.AddSort("Field[#name='FaqCategory']", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Text)
exp.AddSort("Field[#name='FaqSubCategory']", XmlSortOrder.Ascending, XmlCaseOrder.None, "", XmlDataType.Text)
Dim leftNavHTML As New StringBuilder()
Dim faqHTML As New StringBuilder()
Dim currentCategoryName As String = ""
Dim currentFaqSubCategory As String = ""
Dim isFirstPass As Boolean = True
For Each item As XPathNavigator In nav.Select(exp)
Dim FaqCategory As String = item.SelectSingleNode("Field[#name='FaqCategory']").InnerXml
Dim FaqSubCategory As String = item.SelectSingleNode("Field[#name='FaqSubCategory']").InnerXml
Dim FaqQuestion As String = item.SelectSingleNode("Field[#name='FaqQuestion']").InnerXml
Dim FaqAnswer As String = item.SelectSingleNode("Field[#name='FaqAnswer']").InnerXml
Dim isNewFaqCategory As Boolean = False
Dim isNewFaqSubCategory As Boolean = False
If Not currentCategoryName.Equals(FaqCategory) Then
isNewFaqCategory = True
End If
If Not currentFaqSubCategory.Equals(FaqSubCategory) Then
isNewFaqSubCategory = True
End If
If Not isFirstPass And (isNewFaqSubCategory Or isNewFaqCategory) Then
faqHTML.Append("</div>")
End If
If isNewFaqCategory Then
currentCategoryName = FaqCategory
If Not isFirstPass Then
faqHTML.Append("</div><div id=""alp_rightcolumn"">")
End If
leftNavHTML.Append("<h4 class='FaqCategory'>" & FaqCategory & "</h4>")
faqHTML.Append("<h1 class='FaqCategory'>" & FaqCategory & "</h1>")
End If
If Not isFirstPass And (isNewFaqSubCategory Or isNewFaqCategory) Then
faqHTML.Append("</div>")
End If
If isNewFaqSubCategory Then
faqHTML.Append("<div class='FaqSubCategoryDiv'>")
End If
Dim QAID As String = Guid.NewGuid().ToString
If isNewFaqSubCategory Then
currentFaqSubCategory = FaqSubCategory
leftNavHTML.Append("<div class='FaqSubCategory'><a href='#" & QAID & "'>" & FaqSubCategory & "</a></div>")
'faqHTML.Append("<br/>:FIN")
faqHTML.Append("<h2 class='FaqSubCategory'><a name='" & QAID & "'><span class='FAQPlusMinus'> + </span> " & FaqSubCategory & "</a></h2>")
End If
If isNewFaqSubCategory Then
faqHTML.Append("<div class='QuestionsBox'>")
End If
faqHTML.Append("<a class='FAQQuestion' href='#' onClick=""showAnswer('" & QAID & "');return false;"">" & FaqQuestion & "<img src='/images/FAQ_Arrow.gif'/> </a>")
faqHTML.Append("<div class='FAQAnswer " & QAID & "'>" & FaqAnswer & "</div>")
isFirstPass = False
Next
faqHTML.Append("</div>")
faqHTML.Append("</div>")
litFAQLeftColumn.Text = leftNavHTML.ToString
litFAQ.Text = faqHTML.ToString
End Sub