Click here to Skip to main content
15,902,939 members
Articles / Web Development / ASP.NET
Article

Gantt Chart / Event Calendar / Calendar Planner

Rate me:
Please Sign up or sign in to vote.
4.62/5 (48 votes)
9 Jun 2005CPOL4 min read 1.1M   20.1K   311   305
Scrollable ASP.NET Gantt Chart / Event Calendar / Calendar Planner web control.

Sample Image - EventCalendarControl.jpg

Introduction

EventCalendar control is a non-composite web control the creates a Gantt style calendar viewable by quarter periods. The events are detailed on a left hand pane, while the right hand pane shows the events as strips along a horizontal calendar. You can add a hyperlink on these strips to take the user to another document. The right hand pane is scrollable. The events can be grouped into groups which will be shown highlighted above the groups' events. The control takes in XML data for the events.

I was asked to do this at a charity to help projects co-ordinate and know what everyone else is doing. The website allowed people to enter details of an event on a web form which then got displayed grouped by 'business initiative'. The events were stored in an MS SQL server. It was very easy to pull out the data from the DB and format it into hierarchical XML required by the Calendar Control using a DataSet that contained tables and data relations, and then using the GetXml() method of the DataSet.

Using the Code

To use the EventCalendar control on your website, you will need to add the control into the toolbox by right-clicking it, selecting 'Customize Toolbox', selecting the '.NET Framework Components' tab and then clicking on the browse button. Navigate to the EventCalendarControl.dll. This should add it to the toolbox. Then just drag this control onto the page where you want the control to be.

You can then set the Font property of the control in the properties window to whatever you like. I like Arial, 8pt.

Next in the code behind page, onload event, you will need to set some properties of the control.

C#
EventCalendarControl1.XMLData = xmlData;
EventCalendarControl1.BlankGifPath = "trans.gif";
EventCalendarControl1.Year = 2005;
EventCalendarControl1.Quarter = 2;
EventCalendarControl1.BlockColor = "blue";
EventCalendarControl1.ToggleColor = "#dcdcdc";
EventCalendarControl1.CellHeight = 15;
EventCalendarControl1.CellWidth = 15;
  • XMLData: is the data that contains the calendar events, I'll go through the format of it later.
  • BlankGifPath: is the website path to a transparent 1 X 1 GIF. This is the path required by the control to format the calendar grid properly. I couldn't get the grid to properly synch between the left and right hand panes, without resorting to this common webmaster technique. If anyone can get it working without this, please let me know!
  • Year: The year you want the calendar to display.
  • Quarter: The quarter you want the calendar to display (1,2,3,4).
  • BlockColor: This is the default block color for the calendar. You can override it in the XML for individual groups.
  • ToggleColor: This is the color the calendar will use for separating out the weeks and the groups.
  • CellHeight: The height of a cell in the calendar grid.
  • CellWidth: The width of a cell in the calendar grid.

Now for the XML:

The XML format is very simple, simply groups which contain blocks (events). Each group shows up 'grouping' a list of events. Note that, it doesn't matter what contains the group nodes or the top level nodes, as I'm doing a global search on 'group' using the // XPath.

  • Each group has nodes: name, blockcolor and then a list of block nodes.
  • Each block contains: name, startdate, enddate and a href.

Example XML:

XML
xmlData = "<NewDataSet>"
   xmlData += "    <group>";
   xmlData += "      <name>Develop Specifications</name>";
   xmlData += "      <blockcolor>#cc66cc</blockcolor>";
   xmlData += "      <block>";
   xmlData += "        <href>activity.aspx?ActID=17</href>";
   xmlData += "        <StartDate>2005-04-10T00:00:00.0000000+01:00</StartDate>";
   xmlData += "        <EndDate>2005-05-10T00:00:00.0000000+01:00</EndDate>";
   xmlData += "        <name>Technical Architecture</name>";
   xmlData += "      </block>";
   xmlData += "      <block>";
   xmlData += "        <href>activity.aspx?ActID=18</href>";
   xmlData += "        <StartDate>2005-04-15T00:00:00.0000000+01:00</StartDate>";
   xmlData += "        <EndDate>2005-05-15T00:00:00.0000000+01:00</EndDate>";
   xmlData += "        <name>Software Architecture</name>";
   xmlData += "      </block>";
   xmlData += "    </group>";
   xmlData += "</NewDataSet>"

Assuming the data is contained in a database, the best way to generate this XML is by using a DataSet that has two tables, the first table containing the groups and then the second table containing the blocks. Adding a table relation to the DataSet (representing the parent-child relationship) with Nested = true, then doing ToXML() on the DataSet magically creates a nested or hierarchical XML as required above.

About the code

The control is a non-composite control which means it's not based on or derived from standard web controls. Sometimes, when you require greater control over what HTML is produced, you may consider creating this type of control to encapsulate it. It's quite easy to do, all you need to do is to create a 'Web Control Library' and then override the Render or RenderContents method.

I had to use some JavaScript too for the control. The JavaScript allows the control to be resized, so that the scrollbar on the right hand pane of the event calendar resizes. The JavaScript is registered in the OnPreRender event handler.

Further work

Using this code, it should be easy to enhance it, so to add, say, duration into the left hand pane or highlight the critical path.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Technical Lead
United Kingdom United Kingdom
Jean-marc is a IT consultant specializing on the microsoft platform. Jean-marc lives in London, UK.

Comments and Discussions

 
GeneralRe: project enhancement and row height problem Pin
webber12345612-May-06 9:09
webber12345612-May-06 9:09 
GeneralRe: project enhancement and row height problem Pin
Mark Tutt12-May-06 9:19
Mark Tutt12-May-06 9:19 
GeneralDisplay Dates Pin
ironstrike30-Jan-06 23:15
ironstrike30-Jan-06 23:15 
AnswerRe: Display Dates Pin
pdavis28-Feb-06 8:45
pdavis28-Feb-06 8:45 
GeneralRe: Display Dates Pin
ironstrike11-Mar-06 12:02
ironstrike11-Mar-06 12:02 
GeneralProject Plan Pin
Jonie Hermanto30-Jan-06 16:02
Jonie Hermanto30-Jan-06 16:02 
GeneralEventCalendarControl.cs code in vb Pin
webber12345625-Jan-06 16:50
webber12345625-Jan-06 16:50 
GeneralRe: EventCalendarControl.cs code in vb Pin
Svend Nielsen14-Mar-07 0:52
Svend Nielsen14-Mar-07 0:52 
If your still interested.

---------oOo---------
Imports System
Imports System.ComponentModel
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Xml

<defaultproperty("xmldata"), toolboxdata("<{0}:eventkalendercontrol="" runat="server">")> _
Public Class EventKalenderControl
Inherits System.Web.UI.WebControls.WebControl

Dim _text As String
Private m_xmlData As String, m_blockColor As String, m_toggleColor As String, m_cellWidth As String, m_cellHeight As String, m_blankGifPath As String
Private m_year As Integer, m_quarter As Integer
Dim m_names() As String

Public Function EventCalendarControl()
m_names = New String(3) {}
End Function

#Region "Properties"

'
' Gets or sets a value that contains XML data containing the events.
'

<bindable(true), category("appearance"),="" defaultvalue("")=""> _
Public Property XMLData() As String
Get
Return m_xmlData
End Get
Set(ByVal Value As String)
m_xmlData = Value
End Set
End Property

'
' Gets or sets a value that indicates the quarter (1,2,3,4)
'

<bindable(true), category("appearance"),="" defaultvalue(1)=""> _
Public Property Quarter() As Integer
Get
Return m_quarter
End Get
Set(ByVal Value As Integer)
m_quarter = Value
End Set
End Property

'
' Gets or sets a value that indicates the Year e.g. 2005
'

<bindable(true), category("appearance"),="" defaultvalue("")=""> _
Public Property Year() As Integer
Get
Return m_year
End Get
Set(ByVal Value As Integer)
m_year = Value
End Set
End Property

'
' Gets or sets a value that indicates the default BlockColor
'

<bindable(true), category("appearance"),="" defaultvalue("red")=""> _
Public Property BlockColor() As String
Get
Return m_blockColor
End Get
Set(ByVal Value As String)
m_blockColor = Value
End Set
End Property

'
' Gets or sets a value that indicates the cell width of the event calendar 'grid'
'

<bindable(true), category("appearance"),="" defaultvalue("15")=""> _
Public Property CellWidth() As Integer
Get
Return Integer.Parse(m_cellWidth)
End Get
Set(ByVal Value As Integer)
m_cellWidth = Value.ToString()
End Set
End Property

'
' Gets or sets a value that indicates the cell height of the event calendar 'grid'
'

<bindable(true), category("appearance"),="" defaultvalue("15")=""> _
Public Property CellHeight() As Integer
Get
Return Integer.Parse(m_cellHeight)
End Get
Set(ByVal Value As Integer)
m_cellHeight = Value.ToString()
End Set
End Property

'
' Gets or sets a value that indicates a color the event calendar will use to delimit the day names and event names.
'

<bindable(true), category("appearance"),="" defaultvalue("#dcdcdc")=""> _
Public Property ToggleColor() As String
Get
Return m_toggleColor
End Get
Set(ByVal Value As String)
m_toggleColor = Value
End Set
End Property

'
' Gets or sets a value that indicates a color the event calendar will use to delimit the day names and event names.
'

<bindable(true), category("appearance"),="" defaultvalue("#dcdcdc")=""> _
Public Property BlankGifPath() As String
Get
Return m_blankGifPath
End Get
Set(ByVal Value As String)
m_blankGifPath = Value
End Set
End Property
#End Region

#Region "Event Handling"

'
' writes out some javascript so the calendar grid can resize itself
'

' <param name="e" />
Protected Overrides Sub OnPreRender(ByVal e As EventArgs)
MyBase.OnPreRender(e)
If Not MyBase.Page.IsStartupScriptRegistered("EventCalendar") Then
MyBase.Page.RegisterStartupScript("EventCalendar", _
"" + _
"function ResizeTables()" + _
"{" + _
"document.getElementById('divcal').style.width = '1px';" + _
"document.getElementById('divcal').style.width = document.getElementById('tblcal').clientWidth + 'px';" + _
"};" + _
"")

MyBase.Page.RegisterStartupScript("EventCalendarOnLoad", _
"" + _
"ResizeTables();" + _
"")

MyBase.Page.RegisterStartupScript("EventCalendarOnResize", _
"" + _
"ResizeTables();" + _
"")

End If
End Sub


Protected Overrides Sub Render(ByVal writer As HtmlTextWriter)
' create a 2 column, 1 row table, the first column will contain the text for the tasks that
' is non scrollable.

writer.AddAttribute("border", "0")
writer.AddAttribute("cellSpacing", "0")
writer.AddAttribute("cellPadding", "0")
writer.AddAttribute("width", "100%")
writer.RenderBeginTag("table")
writer.RenderBeginTag("tr")


writer.AddAttribute("valign", "top")
writer.AddAttribute("align", "right")
writer.RenderBeginTag("td nowrap")

RenderLeftHandPane(writer)

writer.RenderEndTag()

writer.AddAttribute("id", "tblcal")
writer.AddAttribute("valign", "top")
writer.AddAttribute("align", "left")
writer.AddAttribute("width", "100%")
writer.RenderBeginTag("td nowrap")

RenderRightHandPane(writer)

writer.RenderEndTag()
writer.RenderEndTag()
writer.RenderEndTag()
End Sub
#End Region


#Region "Helper Functions"

Private Sub RenderLeftHandPane(ByVal writer As HtmlTextWriter)

Dim blocktext, grouptext As String

writer.AddAttribute("border", "1")
writer.AddAttribute("style", "FONT-SIZE: " + Font.Size.ToString + ";FONT-FAMILY: " + Font.Name + ";BORDER-COLLAPSE: collapse")
writer.AddAttribute("borderColor", "#000000")
writer.AddAttribute("cellSpacing", "0")
writer.AddAttribute("cellPadding", "0")
writer.RenderBeginTag("table")

'empty row to match month headers on right hand pane
writer.RenderBeginTag("tr")
writer.RenderBeginTag("td")
writer.Write(" ")
writer.RenderEndTag()
writer.RenderEndTag()

'empty row to match day headers on right hand pane
writer.RenderBeginTag("tr")
writer.RenderBeginTag("td")
writer.Write(" ")
writer.RenderEndTag()
writer.RenderEndTag()

' now need to write the rows
' Load the XML
Dim xmlDoc As New XmlDocument
xmlDoc.LoadXml(m_xmlData)

Dim xmlRows As XmlNodeList = xmlDoc.SelectNodes("//group")
Dim xmlRow As XmlNode
For Each xmlRow In xmlRows
grouptext = xmlRow.SelectSingleNode("name").InnerText
writer.RenderBeginTag("tr")
writer.AddAttribute("bgcolor", m_toggleColor)
writer.AddAttribute("height", m_cellHeight)
writer.RenderBeginTag("td nowrap")
writer.Write((" " + grouptext + " "))
writer.RenderEndTag()
writer.RenderEndTag()

Dim xmlBlocks As XmlNodeList = xmlRow.SelectNodes("block")
Dim xmlBlock As XmlNode
For Each xmlBlock In xmlBlocks
writer.RenderBeginTag("tr")

blocktext = xmlBlock.SelectSingleNode("name").InnerText

'write the activity
writer.AddAttribute("height", m_cellHeight)
writer.RenderBeginTag("td nowrap")
writer.Write((" " + blocktext + " "))
writer.RenderEndTag()

writer.RenderEndTag()
Next xmlBlock
Next xmlRow
writer.RenderEndTag()
End Sub 'RenderLeftHandPane


Private Sub RenderRightHandPane(ByVal writer As HtmlTextWriter)
Dim startdate, enddate, dayname, href, blocktext, blockcolor As String
Dim startindex, endindex, imagewidth, month As Integer
Dim i As Integer
Dim week As Boolean = False
Dim quarter As New QuarterHelper(m_year, m_quarter)

writer.AddAttribute("style", "width:1px; overflow-x:scroll;")
writer.AddAttribute("id", "divcal")
writer.RenderBeginTag("div")

writer.AddAttribute("border", "1")
writer.AddAttribute("style", "FONT-SIZE: " + Font.Size.ToString + ";FONT-FAMILY: " + Font.Name + ";BORDER-COLLAPSE: collapse")
writer.AddAttribute("borderColor", "#000000")
writer.AddAttribute("cellSpacing", "0")
writer.AddAttribute("cellPadding", "0")
writer.RenderBeginTag("table")

'write month headers
writer.RenderBeginTag("tr")

For i = 1 To 3
month = i + 3 * (quarter.QuarterIndex - 1)
writer.AddAttribute("align", "center")
writer.AddAttribute("colspan", quarter.TotalDaysInMonth(month).ToString())
writer.RenderBeginTag("td")
writer.Write(quarter.GetMonthName(i))
writer.RenderEndTag()
Next i
writer.RenderEndTag()

'write day headers
writer.RenderBeginTag("tr")

For i = 3 * quarter.QuarterIndex - 2 To 3 * quarter.QuarterIndex
Dim j As Integer
For j = 1 To quarter.TotalDaysInMonth(i)
dayname = quarter.GetDayName(i, j)
If dayname = "M" Then
week = Not week
End If
writer.AddAttribute("align", "center")
writer.AddAttribute("width", m_cellWidth)
writer.AddAttribute("height", m_cellHeight)
If week Then
writer.AddAttribute("bgcolor", m_toggleColor)
End If
writer.RenderBeginTag("td")
writer.Write(dayname)
writer.RenderEndTag()
Next j
Next i
writer.RenderEndTag()

' now need to write the rows
' Load the XML
Dim xmlDoc As New XmlDocument
xmlDoc.LoadXml(m_xmlData)

Dim xmlRows As XmlNodeList = xmlDoc.SelectNodes("//group")
Dim xmlRow As XmlNode
For Each xmlRow In xmlRows

' empty row to match group name
writer.RenderBeginTag("tr")
writer.AddAttribute("colspan", quarter.Days.ToString())
writer.AddAttribute("width", (quarter.Days * Integer.Parse(m_cellWidth)).ToString())
writer.RenderBeginTag("td")
writer.Write((" "))
writer.RenderEndTag()
writer.RenderEndTag()

Dim node As XmlNode = xmlRow.SelectSingleNode("blockcolor")
If Not (node Is Nothing) Then
blockcolor = node.InnerText
Else
blockcolor = m_blockColor
End If

' write out the events
Dim strHTML As String
Dim xmlBlocks As XmlNodeList = xmlRow.SelectNodes("block")
Dim xmlBlock As XmlNode
For Each xmlBlock In xmlBlocks
writer.RenderBeginTag("tr")
startdate = xmlBlock.SelectSingleNode("StartDate").InnerText
enddate = xmlBlock.SelectSingleNode("EndDate").InnerText
href = xmlBlock.SelectSingleNode("href").InnerText
blocktext = xmlBlock.SelectSingleNode("name").InnerText

startindex = quarter.getColumnIndex(startdate)
endindex = quarter.getColumnIndex(enddate)

'write out the padding cells
For i = 0 To startindex - 1
writer.AddAttribute("width", m_cellWidth)
writer.AddAttribute("height", m_cellHeight)
writer.RenderBeginTag("td")
writer.Write(" ")
writer.RenderEndTag()
Next i

'create the filled in block
writer.AddAttribute("colspan", (endindex - startindex + 1).ToString())
writer.AddAttribute("bgColor", blockcolor)
writer.AddAttribute("width", m_cellWidth)
writer.AddAttribute("height", m_cellHeight)
writer.RenderBeginTag("td nowrap")
If href <> String.Empty Then

imagewidth = (endindex - startindex + 1) * Integer.Parse(m_cellWidth)

strHTML = ""

writer.Write(strHTML)
Else
writer.Write(" ")
End If
writer.RenderEndTag()
'
'write out the padding cells
For i = endindex To (quarter.Days - 1) - 1
writer.AddAttribute("width", m_cellWidth)
writer.AddAttribute("height", m_cellHeight)
writer.RenderBeginTag("td")
writer.Write(" ")
writer.RenderEndTag()
Next i
writer.RenderEndTag()
Next xmlBlock
Next xmlRow
writer.RenderEndTag() ' close table tag
writer.RenderEndTag() ' close div tag
End Sub 'RenderRightHandPane
#End Region

#Region "Helper Classes"
Private Class QuarterHelper
Private m_year As Integer
Private m_quarter As Integer
Private m_names(3) As String
Private m_NoOfDays As Integer


Public Sub New()
End Sub 'New


Public Sub New(ByVal year As Integer, ByVal quarter As Integer)
m_quarter = quarter
m_year = year
m_names = getQuarterNames()
m_NoOfDays = getDaysInQuarter(m_year, m_quarter)
End Sub 'New


Public ReadOnly Property Year() As Integer
Get
Return m_year
End Get
End Property


Public ReadOnly Property QuarterIndex() As Integer
Get
Return m_quarter
End Get
End Property


Public ReadOnly Property Names() As String()
Get
Return m_names
End Get
End Property


Public ReadOnly Property Days() As Integer
Get
Return m_NoOfDays
End Get
End Property


Public Function GetMonthName(ByVal i As Integer) As String
Return m_names((i - 1))
End Function 'GetMonthName


Public Function TotalDays() As Integer
Dim retval As Integer = 0
Select Case m_quarter
Case 1
retval = DateTime.DaysInMonth(m_year, 1)
retval += DateTime.DaysInMonth(m_year, 2)
retval += DateTime.DaysInMonth(m_year, 3)
Case 2
retval = DateTime.DaysInMonth(m_year, 4)
retval += DateTime.DaysInMonth(m_year, 5)
retval += DateTime.DaysInMonth(m_year, 6)
Case 3
retval = DateTime.DaysInMonth(m_year, 7)
retval += DateTime.DaysInMonth(m_year, 8)
retval += DateTime.DaysInMonth(m_year, 9)
Case 4
retval = DateTime.DaysInMonth(m_year, 10)
retval += DateTime.DaysInMonth(m_year, 11)
retval += DateTime.DaysInMonth(m_year, 12)
End Select
Return retval
End Function 'TotalDays


Public Function TotalDaysInMonth(ByVal i As Integer) As Integer
Return DateTime.DaysInMonth(m_year, i)
End Function 'TotalDaysInMonth


Public Function GetDayName(ByVal month As Integer, ByVal day As Integer) As String
Dim retval As String = String.Empty
Dim d As New DateTime(m_year, month, day)
Select Case d.DayOfWeek
Case DayOfWeek.Monday
retval = "M"
Case DayOfWeek.Tuesday
retval = "T"
Case DayOfWeek.Wednesday
retval = "O"
Case DayOfWeek.Thursday
retval = "T"
Case DayOfWeek.Friday
retval = "F"
Case DayOfWeek.Saturday
retval = "L"
Case DayOfWeek.Sunday
retval = "S"

'Case DayOfWeek.Monday
' retval = "M"
'Case DayOfWeek.Tuesday
' retval = "T"
'Case DayOfWeek.Wednesday
' retval = "W"
'Case DayOfWeek.Thursday
' retval = "T"
'Case DayOfWeek.Friday
' retval = "F"
'Case DayOfWeek.Saturday
' retval = "S"
'Case DayOfWeek.Sunday
' retval = "S"

End Select
Return retval
End Function 'GetDayName


Private Function getQuarterNames() As String()
Dim retval(3) As String

Select Case m_quarter
Case 1
retval(0) = "Januar"
retval(1) = "Febuar"
retval(2) = "Marts"
Case 2
retval(0) = "April"
retval(1) = "Maj"
retval(2) = "Juni"
Case 3
retval(0) = "Juli"
retval(1) = "August"
retval(2) = "September"
Case 4
retval(0) = "Oktober"
retval(1) = "November"
retval(2) = "December"


'Case 1
' retval(0) = "January"
' retval(1) = "Febuary"
' retval(2) = "March"
'Case 2
' retval(0) = "April"
' retval(1) = "May"
' retval(2) = "June"
'Case 3
' retval(0) = "July"
' retval(1) = "August"
' retval(2) = "September"
'Case 4
' retval(0) = "October"
' retval(1) = "November"
' retval(2) = "December"
End Select

Return retval
End Function 'getQuarterNames


Private Function getDaysInQuarter(ByVal year As Integer, ByVal quarter As Integer) As Integer
Dim dtS, dtE As DateTime
If quarter < 4 Then
dtS = New DateTime(year, 3 * quarter - 2, 1)
dtE = New DateTime(year, 3 * quarter - 2 + 3, 1)
Else
dtS = New DateTime(year, 3 * quarter - 2, 1)
dtE = New DateTime(year + 1, 1, 1)
End If

Dim ts As New TimeSpan(dtE.Subtract(dtS).Ticks)
Return ts.Days
End Function 'getDaysInQuarter


Public Function getColumnIndex(ByVal day As String) As Integer
Dim dt As DateTime = DateTime.Parse(day)
Dim offset As Integer = 0
Dim retval As Integer = 0
Dim i As Integer
For i = 1 To m_quarter - 1
offset += getDaysInQuarter(m_year, i)
Next i
retval = dt.DayOfYear - 1 - offset
If retval < 0 Then
retval = 0
End If
If retval > getDaysInQuarter(m_year, m_quarter) Then
retval = getDaysInQuarter(m_year, m_quarter)
End If
Return retval
End Function 'getColumnIndex
End Class 'QuarterHelper


#End Region

End Class

------o0o----------
Regards

Svend
GeneralBug correction and some improves Pin
Eduardo Calixto2-Jan-06 15:18
Eduardo Calixto2-Jan-06 15:18 
GeneralRe: Bug correction and some improves Pin
webber12345610-Jan-06 10:58
webber12345610-Jan-06 10:58 
GeneralRe: Bug correction and some improves Pin
ironstrike30-Jan-06 23:11
ironstrike30-Jan-06 23:11 
GeneralRe: Bug correction and some improves Pin
duffy2486-Apr-06 3:50
duffy2486-Apr-06 3:50 
GeneralRe: Bug correction and some improves Pin
Mark Tutt12-May-06 8:07
Mark Tutt12-May-06 8:07 
GeneralRe: Bug correction and some improves Pin
Andoni Torres21-Jun-06 20:48
Andoni Torres21-Jun-06 20:48 
GeneralRe: Bug correction and some improves Pin
kayakko2-Jul-07 4:17
kayakko2-Jul-07 4:17 
QuestionGreat control - any new features? Pin
eerwin23-Dec-05 3:51
eerwin23-Dec-05 3:51 
GeneralCannot get the XML file to work Help Pin
Member 81937918-Aug-05 10:46
Member 81937918-Aug-05 10:46 
GeneralRe: Cannot get the XML file to work Help Pin
Anonymous18-Aug-05 22:07
Anonymous18-Aug-05 22:07 
GeneralRe: Cannot get the XML file to work Help Pin
Member 81937919-Aug-05 6:01
Member 81937919-Aug-05 6:01 
QuestionCan i change the xml nodes Pin
18-Aug-05 8:01
suss18-Aug-05 8:01 
GeneralNew version Pin
Mihc11-Aug-05 0:29
Mihc11-Aug-05 0:29 
GeneralOnClick events Pin
i386.com2-Aug-05 2:18
i386.com2-Aug-05 2:18 
GeneralRe: OnClick events Pin
duffy2486-Apr-06 3:52
duffy2486-Apr-06 3:52 
Generalrefactor Pin
Jean-marc Lai28-Jul-05 0:05
Jean-marc Lai28-Jul-05 0:05 
Generalmultispot version Pin
yl tang18-Jul-05 0:56
yl tang18-Jul-05 0:56 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.