2009-07-07 20 views
12

Ich verwende den folgenden Code zur Zeit eine Combobox zu füllen:WinForms Combobox mit mehreren Spalten (C#)?

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

Gibt es eine Möglichkeit, mehrere Spalten angezeigt werden soll. Ich habe "Auftragsnummer, Kunde, Beschreibung" für DisplayMember ausprobiert, aber es hat nicht funktioniert.

Antwort

0

Sie können keine Mehrfachspalten-Kombinationsfeld haben.

Würden Sie nicht besser dran mit einem DataGridView statt

+0

Die Tatsache, dass es nativ im .NET-Framework nicht existiert bedeutet nicht, dass Sie es nicht haben können ... Sie können es selbst codieren, oder verwenden Sie ein Steuerelement von Drittanbietern –

+0

Denken Sie, er sucht dies zu tun über die Standard-Steuerelemente in .NET tho – James

+0

Danke James. Ich werde stattdessen eine DataGridView verwenden, die sicher ist, dass es in .Net keine Out-of-Box Mehrfachspalte Combobox gibt. –

3

Es ist nicht verfügbar ist out-of-the-Box in .NET (es Windows-Formulare oder asp.net der Dropdownlist sein) lesen Sie in diesem Code-Projektelement aus für Referenz, wie Sie Ihre eigenen bauen können. (Es gibt jedoch viel mehr).

Code Project

+1

+1 für eine gute Verbindung ... und für den Google-Rat;) –

+0

Danke für Sie Beratung, aber ich googelte zuerst und ich stieß auch auf diese Projekte. Ich entschied mich trotzdem zu fragen, weil es mir schien, dass einige der Projekte ein bisschen alt waren und ich irgendwie die Antwort geben wollte, dass es keinen Standard Weg gibt, mehrere Spalten in einer Combobox zu implementieren. –

+0

Sie sind alt, aber sie sollten Ihnen immer noch die Antworten geben, wie Sie Ihre eigene Combo "OwnerDrawn" erstellen können. – Colin

0

Schnell Lösung
Datentabellen sollten so weit partical Klassen sein, wie ich erinnere mich

  1. eine zweite Datei erstellen für Ihre Datentabelle MyDataTable.custom.cs
  2. Fügen Sie eine Zeichenfolgeeigenschaft in der partiellen Datentabelle Klasse calle hinzu d "DisplayProperty"
  3. In dieser Eigenschaft ein string.format return ("{0} {1} {2}" Auftragsnummer, Kunde, Beschreibung);
  4. Bind Ihre Datamember zu Ihrem DisplayProperty
+0

Berechnete Spalte ist noch besser, wenn Sie das Layout der Datentabelle ändern können –

5

Sie ihren Datensatz eine Dummy-Spalte (Description) und verwenden, die als DisplayMember im Kombinationsfeld Datenbindung hinzufügen können.

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

einfach und funktioniert.

+0

oder Sie können einen einfachen Konverter erstellen – S3ddi9

7

Es gibt einen Artikel in MSDN, der beschreibt, wie eine Multicolumn ComboBox erstellt werden kann.

Wie eine mehrspaltige Dropdown-Liste für ein Kombinationsfeld in Windows-

aus dem Download für VB aus dem obigen Microsoft

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


Quellcode Formulare erstellen Link, der sich leicht an eine ListBox sowie eine ComboBox anpassen lässt:

'************************************* 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

Viel einfacher als es klingt, und es gibt Ihnen auch die Möglichkeit, Farben basierend auf Bedingungen ändern, ändern Sie die Farbe des Teilers, etc . Gute Lösung. –

Verwandte Themen