Multi-column data in ListBox

Viewed 78201

I want to have multi-column in my ListBox. Below is the example of picture I got in my application.

Picture of a ListBox that does not have multi-columns

I actually have about 7 columns, but printed out only two columns to make it easier to understand.

So, the first column would say date and the second column would say name. As you can see, the data did not go into their own columns.

This is my code:

this.listBox1 = new System.Windows.Forms.ListBox();
this.SuspendLayout();
// 
// listBox1
// 
this.listBox1.FormattingEnabled = true;
this.listBox1.HorizontalScrollbar = true;

foreach (XmlNode xn in xnList)
{
    string date = xn.OfType<XmlNode>().FirstOrDefault(n => n.Name == "Date").FirstChild.Value;
    string id = xn.OfType<XmlNode>().FirstOrDefault(n => n.Name == "ID").FirstChild.Value;
    if (date == cari)
    {
        this.listBox1.Items.AddRange(new object[] {                    
        //dateBox.Text,
        dateBox.Text + "\r\n" + date});

        this.listBox1.Items.AddRange(new object[] {                    
        "sarabrown"});
    }
}
this.listBox1.Location = new System.Drawing.Point(12, 28);
this.listBox1.MultiColumn = true;
this.listBox1.Name = "listBox1";
this.listBox1.ScrollAlwaysVisible = true;
this.listBox1.Size = new System.Drawing.Size(300, 95);
this.listBox1.TabIndex = 0;
this.listBox1.ColumnWidth = 100;
// 
// Form3
// 
this.ClientSize = new System.Drawing.Size(400, 273);
this.Controls.Add(this.listBox1);
this.Name = "Form3";
this.ResumeLayout(false);

I found this code there, but it creates a list box that looks just like the one pictured above. Is there anyone knows about this?

4 Answers

I think you misunderstood the usage of MultiColumn property in ListBox.

From MSDN :

A multicolumn ListBox places items into as many columns as are needed to make vertical scrolling unnecessary.

So this is just a thing to avoid scrolling.

If you want to display several columns with separate data on each column, I suggest you use ListView.

I have been able to create a code so that I can order dates from any year range from a spreadsheet in Excel.

Private Sub UserForm_Initialize()

 With Me

       .StartUpPosition = 0
        '.Width = Application.Width * 0.46
        '.Height = Application.Height * 0.57
        .Left = Application.Left + (Application.Width * 0.7) \ 2
        .Top = Application.Top + (Application.Height * 0.3) \ 2

 End With

End Sub

Private Sub CommandButton1_Click()

initialize ("lth") 'Call rutine "initialize" to order listbox from down to up

End Sub

Private Sub CommandButton2_Click()

initialize ("htl") 'Call rutine "initialize" to order listbox from up to down

End Sub

Sub initialize(ByVal ordertype As String)

Dim x As Integer
Dim i As Integer
Dim fechas As Date
Dim datofecha As String
Dim arrayyear() As Date
Dim diasmesbisiesto(1 To 12) As Integer
Dim diasmesnobisiesto(1 To 12) As Integer
Dim lastrow As Integer
Dim mayoryear As Integer
Dim menoryear As Integer
Dim f As Integer
Dim c As Date

lastrow = Worksheets(1).Range("A" & Rows.Count).End(xlUp).Row

ReDim arrayyear(lastrow)

For u = 1 To lastrow

arrayyear(u) = Format(Sheet1.Cells(u, 1).Value, "dd/mm/yyyy")

Next u



'-------------------------
'Obtener mayor valor fecha
'-------------------------
Dim vm As Integer
Dim maxindex As Integer

maxindex = 1

For vm = 2 To UBound(arrayyear) 'suponemos indice desde 1 a n
If arrayyear(vm) > arrayyear(maxindex) Then
maxindex = vm
End If
Next

mayor = arrayyear(maxindex)
'-------------------------



'-------------------------
'Obtener menor valor fecha
'-------------------------
Dim vn As Integer
Dim minindex As Integer

minindex = 1

For vn = 2 To UBound(arrayyear) 'suponemos indice desde 1 a n
If arrayyear(minindex) < arrayyear(vn) Then

Else
minindex = vn
End If

Next

menor = arrayyear(minindex)
'-------------------------


menoryear = Year(menor) ' Asign the lowest year in menoryear
mayoryear = Year(mayor) ' Asign the highest year in mayoryear
ListBox1.Clear

'Carga vector diasmesbisiesto
'---------------------------
diasmesbisiesto(1) = 31
diasmesbisiesto(2) = 29
diasmesbisiesto(3) = 31
diasmesbisiesto(4) = 30
diasmesbisiesto(5) = 31
diasmesbisiesto(6) = 30
diasmesbisiesto(7) = 31
diasmesbisiesto(8) = 31
diasmesbisiesto(9) = 30
diasmesbisiesto(10) = 31
diasmesbisiesto(11) = 30
diasmesbisiesto(12) = 31
'---------------------------

'Carga vector diasmesnobisiesto
'---------------------------
diasmesnobisiesto(1) = 31
diasmesnobisiesto(2) = 28
diasmesnobisiesto(3) = 31
diasmesnobisiesto(4) = 30
diasmesnobisiesto(5) = 31
diasmesnobisiesto(6) = 30
diasmesnobisiesto(7) = 31
diasmesnobisiesto(8) = 31
diasmesnobisiesto(9) = 30
diasmesnobisiesto(10) = 31
diasmesnobisiesto(11) = 30
diasmesnobisiesto(12) = 31
'---------------------------

f = 0 'Variable para ubicar la ubicacion de la fila en donde se guardaran los datos en el listbox
cuenta = 0 ' Variable para contar la cantidad de elementos que se cargaron en el listbox

If ordertype = "lth" Then

 GoTo 1 ' Ordering lowest to highest


End If

If ordertype = "htl" Then

 GoTo 2 ' Ordering highest to lowest

End If

'---------------------------
' Ordering lowest to highest
'---------------------------
1:

For anio = menoryear To mayoryear

    For mes = 1 To 12

            If (anio Mod 4 = 0 And anio Mod 100 <> 0 Or anio Mod 400 = 0) Then

                 ' Años bisiestos
                 diasmes = diasmesbisiesto(mes)

            Else

                 ' Años no bisiestos
                 diasmes = diasmesnobisiesto(mes)

            End If

            datofecha = Format(DateSerial(anio, mes, 1), "dd/mm/yyyy")

            fechas = datofecha

            'Carga del listbox
            '------------------------------------------------------------------------------------------------------------
                For x = 0 To diasmes - 1

                        For i = 1 To lastrow
                        c = fechas
                        If Format(Sheet1.Cells(i, 1), "dd/mm/yyyy") = c + x Then

                            Me.ListBox1.AddItem


                           Me.ListBox1.List(f, 0) = Format(Sheet1.Cells(i, 1), "dd/m/yyyy")
                           cuenta = cuenta + 1
                            For b = 1 To 1

                             Me.ListBox1.List(f, b) = Sheet1.Cells(i, b + 1)

                            Next b
                            f = f + 1
                        End If

                        Next i

                Next x
             '------------------------------------------------------------------------------------------------------------
    Next mes

Next anio

Label2.Caption = "Number of Elements: " & cuenta
Label3.Caption = "Order from Lowest to Highest "

Exit Sub

'---------------------------
' Ordering highest to lowest
'---------------------------
2:

For anio = mayoryear To menoryear Step -1

    For mes = 12 To 1 Step -1

            If (anio Mod 4 = 0 And anio Mod 100 <> 0 Or anio Mod 400 = 0) Then

                 ' Años bisiestos
                 diasmes = diasmesbisiesto(mes)

            Else

                 ' Años no bisiestos
                 diasmes = diasmesnobisiesto(mes)

            End If

            datofecha = Format(DateSerial(anio, mes, diasmes), "dd/mm/yyyy")

            fechas = datofecha

            'Carga del listbox
            '------------------------------------------------------------------------------------------------------------
                For x = 0 To diasmes - 1

                        For i = 1 To lastrow
                        c = fechas
                        If Format(Sheet1.Cells(i, 1), "dd/mm/yyyy") = c - x Then

                            Me.ListBox1.AddItem


                           Me.ListBox1.List(f, 0) = Format(Sheet1.Cells(i, 1), "dd/m/yyyy")
                           cuenta = cuenta + 1
                            For b = 1 To 1

                             Me.ListBox1.List(f, b) = Sheet1.Cells(i, b + 1)

                            Next b
                            f = f + 1
                        End If

                        Next i

                Next x
             '------------------------------------------------------------------------------------------------------------
    Next mes

Next anio

Label2.Caption = "Number of Elements: " & cuenta
Label3.Caption = "Order from Highest to Lowest "

Exit Sub

End Sub
Related