ListBox中的多列数据

时间:2012-08-09 04:49:56

标签: c# .net winforms listbox multiple-columns

我想在ListBox中使用多列。以下是我在申请中获得的图片示例。

Picture of a ListBox that does not have multi-columns

我实际上有大约7列,但只打印出两列,以便更容易理解。

因此,第一列会说date,第二列会说name。如您所见,数据没有进入他们自己的列。

这是我的代码:

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);

我找到了这段代码there,但它创建了一个类似上图所示的列表框。有没有人知道这个?

4 个答案:

答案 0 :(得分:4)

ListBox的MultiColumn属性仅有助于避免垂直滚动,因此只是将溢出的项目堆叠到下一列中。默认情况下,.NET中不提供您的要求。因此,您可能必须构建自己的自定义控件来支持它。

顺便说一下,GridView是你的朋友..使用GridView可以轻松实现所需。 例如,为了简单化(你可能必须完全调整它以适应你的问题)

protected void MyGridView_PreRender(object sender, EventArgs e)
{
DataSet myDataSet = new DataSet();
myDataSet.ReadXml(new StringReader(myXmlDoc.OuterXml));
GridView gv = (GridView)sender;
gv.DataSource = myDataSet;
gv.DataBind();
}

<强>更新
您可能想要查看ListView而不是GridView或ListBox 检查此example,以便给出一个想法 或者这个更简单:Using ListView control in C# 有了这个,您还可以在不同的列中添加其他控件,如复选框 这比GridView相对轻量级。

答案 1 :(得分:0)

对于C#中ListBox中的MutliColumn,这样可以正常工作

listBox1.Items.AddRange(
    new object[]
    {
        "Name","Aman"

    }
);

答案 2 :(得分:0)

我认为您误解了ListBox中MultiColumn属性的用法。

From MSDN :

  

多列列表框将项目放置在所需的尽可能多的列中,从而无需垂直滚动。

所以这只是避免滚动的事情。

如果要显示几列,每列显示单独的数据,建议您使用ListView

答案 3 :(得分:-2)

我已经能够创建代码,以便可以从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