2009-07-07 27 views
12

estoy usando actualmente el siguiente código para rellenar un cuadro combinado:Cuadro combinado de WinForms con varias columnas (C#)?

combobox.DataSource = datatable; 
combobox.DisplayMember = "Auftragsnummer"; 
combobox.ValueMember = "ID"; 

¿Hay una manera de mostrar varias columnas. Intenté "Auftragsnummer, Kunde, Beschreibung" para DisplayMember pero no funcionó.

Respuesta

0

No puede tener un cuadro combinado de varias columnas.

podría No sería mejor usar una vez DataGridView

+0

El hecho de que no exista de forma nativa en .NET Framework no significa que no pueda tenerlo ... Puede codificarlo usted mismo, o usar un control de terceros –

+0

Creo que está buscando hacer esto a través de los controles estándar en .NET tho – James

+0

Gracias James. Voy a utilizar un DataGridView ahora que estoy seguro de que no hay un cuadro combinado de columna múltiple en .Net. –

3

No está disponible fuera de la caja en .NET (ya sea Windows o formas de lista desplegable asp.net) echa un vistazo a este artículo del proyecto de código para referencia sobre cómo construir tu propio. (aunque hay muchas más)

Code Project

+1

+1 para un buen enlace ... y para el consejo de google;) –

+0

Gracias por su consejo, pero busqué en Google primero y me encontré con esos proyectos también. Decidí preguntar de todos modos porque me pareció que algunos de los proyectos son un poco viejos y quería de alguna manera dar una respuesta definitiva a que no hay una forma estándar para implementar columnas múltiples en un cuadro combinado. –

+0

Son antiguos, pero aún así deberían proporcionarle las respuestas sobre cómo crear su propio cuadro combinado "OwnerDrawn". – Colin

0

solución rápida
DataTables debe haber clases partical por lo que yo recuerdo

  1. Cree un segundo archivo para su tabla de datos MyDataTable.custom.cs
  2. Agregue una propiedad de cadena en la clase de tabla de datos parcial calle d "DisplayProperty"
  3. En esa propiedad devolver un string.format ("{0} {1} {2}", Auftragsnummer, Kunde, Beschreibung);
  4. vincular a su DataMember a su DisplayProperty
+0

La columna calculada es aún mejor si puede cambiar el diseño de tablas de datos –

5

Puede añadir a su conjunto de datos de una columna ficticia (Description) y usar eso como DisplayMember en el cuadro combinado de enlace de datos.

SELECT Users.*, Surname+' '+Name+' - '+UserRole AS Description FROM Users 
ComboBox.DataBindings.Add(new Binding("SelectedValue", bs, "ID")); 
ComboBox.DataSource = ds.Tables["Users"]; 
ComboBox.DisplayMember = "Description"; 
ComboBox.ValueMember = "ID"; 

simple y funciona.

+0

o puede crear un convertidor simple – S3ddi9

7

Hay un artículo en MSDN que describe cómo se puede crear una ComboBox Multicolumn.

Cómo crear una lista desplegable de varias columnas para un cuadro combinado en Windows Forms

http://support.microsoft.com/kb/982498


El código fuente de la descarga para VB de lo anterior Microsoft Enlace, que se puede adaptar fácilmente para trabajar con un ListBox y un ComboBox:

'************************************* Module Header **************************************' 
' Module Name: MainForm.vb 
' Project:  VBWinFormMultipleColumnComboBox 
' Copyright (c) Microsoft Corporation. 
' 
' 
' This sample demonstrates how to display multiple columns of data in the dropdown of a ComboBox. 
' 
' This source is subject to the Microsoft Public License. 
' See http://www.microsoft.com/opensource/licenses.mspx#Ms-PL. 
' All other rights reserved. 
' 
' THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, 
' EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED 
' WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. 
'******************************************************************************************' 

Imports System 
Imports System.Collections.Generic 
Imports System.ComponentModel 
Imports System.Data 
Imports System.Drawing 
Imports System.Linq 
Imports System.Text 
Imports System.Windows.Forms 
Imports System.Drawing.Drawing2D 

Public Class MainForm 

    Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     Dim dtTest As DataTable = New DataTable() 
     dtTest.Columns.Add("ID", GetType(Integer)) 
     dtTest.Columns.Add("Name", GetType(String)) 

     dtTest.Rows.Add(1, "John") 
     dtTest.Rows.Add(2, "Amy") 
     dtTest.Rows.Add(3, "Tony") 
     dtTest.Rows.Add(4, "Bruce") 
     dtTest.Rows.Add(5, "Allen") 

     ' Bind the ComboBox to the DataTable 
     Me.comboBox1.DataSource = dtTest 
     Me.comboBox1.DisplayMember = "Name" 
     Me.comboBox1.ValueMember = "ID" 

     ' Enable the owner draw on the ComboBox. 
     Me.comboBox1.DrawMode = DrawMode.OwnerDrawFixed 
     ' Handle the DrawItem event to draw the items. 
    End Sub 

    Private Sub comboBox1_DrawItem(ByVal sender As System.Object, _ 
            ByVal e As System.Windows.Forms.DrawItemEventArgs) _ 
            Handles comboBox1.DrawItem 
     ' Draw the default background 
     e.DrawBackground() 

     ' The ComboBox is bound to a DataTable, 
     ' so the items are DataRowView objects. 
     Dim drv As DataRowView = CType(comboBox1.Items(e.Index), DataRowView) 

     ' Retrieve the value of each column. 
     Dim id As Integer = drv("ID").ToString() 
     Dim name As String = drv("Name").ToString() 

     ' Get the bounds for the first column 
     Dim r1 As Rectangle = e.Bounds 
     r1.Width = r1.Width/2 

     ' Draw the text on the first column 
     Using sb As SolidBrush = New SolidBrush(e.ForeColor) 
      e.Graphics.DrawString(id, e.Font, sb, r1) 
     End Using 

     ' Draw a line to isolate the columns 
     Using p As Pen = New Pen(Color.Black) 
      e.Graphics.DrawLine(p, r1.Right, 0, r1.Right, r1.Bottom) 
     End Using 

     ' Get the bounds for the second column 
     Dim r2 As Rectangle = e.Bounds 
     r2.X = e.Bounds.Width/2 
     r2.Width = r2.Width/2 

     ' Draw the text on the second column 
     Using sb As SolidBrush = New SolidBrush(e.ForeColor) 
      e.Graphics.DrawString(name, e.Font, sb, r2) 
     End Using 
    End Sub 
End Class 
+0

Mucho más fácil de lo que parece, y también le da la oportunidad de cambiar colores según las condiciones, cambiar el color del divisor, etc. . Buena solución. –

Cuestiones relacionadas