2009-07-07 4 views
12

Sto usando attualmente il seguente codice per popolare una casella combinata:Casella combinata WinForms con più colonne (C#)?

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

C'è un modo per visualizzare più colonne. Ho provato "Auftragsnummer, Kunde, Beschreibung" per DisplayMember ma non ha funzionato.

risposta

0

Non è possibile avere una casella combinata a più colonne.

non sareste meglio utilizzare un DataGridView invece

+0

Il fatto che non esista nativamente nel framework .NET non significa che non puoi averlo ... Puoi codificarlo da solo o usare un controllo di terze parti –

+0

Pensa che stia cercando di farlo tramite i controlli standard in .NET tho – James

+0

Grazie James. Ora userò un DataGridView che è sicuro che non ci sia una combobox multi colonna fuori dalla scatola in .Net. –

3

Non è disponibile out-of-the-box in .NET (che si tratti di forme di Windows o DropDownList di asp.net) Dai un'occhiata a questo elemento del progetto di codice per riferimento su come costruire il tuo. (ce ne sono molti di più).

Code Project

+1

+1 per un buon collegamento ... e per il consiglio di google;) –

+0

Grazie per il tuo consiglio ma ho cercato su Google e ho trovato anche quei progetti. Ho deciso di chiedere comunque perché mi sembrava che alcuni dei progetti fossero un po 'vecchi e volevo in qualche modo rispondere definitivamente che non esiste un modo standard per implementare più colonne in una combobox. –

+0

Sono vecchi, ma dovrebbero comunque fornirti le risposte su come creare la tua casella combinata "OwnerDrawn". – Colin

0

Soluzione rapida
DataTable dovrebbe essere classi partical per quanto mi ricordo

  1. Creare un secondo file di per il datatable MyDataTable.custom.cs
  2. Aggiungere una proprietà stringa nella classe parziale datatable parziale d "DisplayProperty"
  3. In tale proprietà restituire uno String.Format ("{0} {1} {2}", Auftragsnummer, Kunde, Beschreibung);
  4. vincolare il proprio Datamember al DisplayProperty
+0

La colonna calcolata è ancora migliore se puoi modificare il layout datatable –

5

È possibile aggiungere al vostro set di dati di una colonna fittizia (Description) e utilizzarlo come DisplayMember nella casella combinata associazione dati.

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

semplice e funziona.

+0

oppure puoi creare un semplice convertitore – S3ddi9

7

C'è un articolo su MSDN che descrive come può essere creato un ComboBox multicolor.

Come creare un elenco a discesa a più colonne per una casella combinata in Windows Form

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


codice sorgente dal download per VB da quanto sopra Microsoft Link, che può essere facilmente adattato per funzionare con un ListBox e 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

Molto più semplice di quanto possa sembrare, e ti dà anche la possibilità di cambiare i colori in base alle condizioni, cambiare il colore del divisore, ecc. Buona soluzione. –