web-dev-qa-db-fra.com

Zone de liste déroulante WinForm avec plusieurs colonnes (C #)?

J'utilise actuellement le code suivant pour remplir une liste déroulante:

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

Est-il possible d'afficher plusieurs colonnes? J'ai essayé "Auftragsnummer, Kunde, Beschreibung" pour DisplayMember mais cela n'a pas fonctionné.

12
user134146

Vous ne pouvez pas avoir plusieurs colonnes. Bien que vous puissiez avoir la concaténation de plusieurs champs en tant que membre d'affichage

Check out: Comment lier un Combo afin que le membre d'affichage puisse concaténer 2 champs de la source de données?

12
Rashmi Pandit

Un article sur MSDN décrit comment créer une zone de liste déroulante multicolonne.

Comment créer une liste déroulante à plusieurs colonnes pour une liste déroulante dans Windows Forms

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


Code source du téléchargement pour VB du lien Microsoft ci-dessus, qui peut être facilement adapté pour fonctionner avec un contrôle ListBox ainsi qu'avec un contrôle 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
8
Irshad

Vous pouvez ajouter à votre ensemble de données une colonne fictive (Description) et l'utiliser comme DisplayMember dans la liaison de données de la boîte à options.

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 et fonctionne.

5
bizabo

Il n'est pas disponible directement dans .NET (que ce soit les formulaires Windows ou la liste déroulante de asp.net) Cochez cet élément de projet de code pour savoir comment créer le vôtre. (il y a des charges plus si).

Code Project

3
Colin

Un article sur Code Project décrit comment créer une zone de liste déroulante multicolonne.

Combobox multicolonne - Code Project

2
Pop Catalin

Solution rapide
Les datatables devraient être des classes partielles pour autant que je m'en souvienne  

  1. Créez un 2ème fichier pour votre datatable MyDataTable.custom.cs
  2. Ajouter une propriété de chaîne dans la classe partielle datatable appelée "DisplayProperty"
  3. Dans cette propriété, retourne string.format ("{0} {1} {2}", Auftragsnummer, Kunde, Description);
  4. Liez votre Datamember à votre DisplayProperty
0
Peter Gfader

Vous ne pouvez pas avoir une liste déroulante à plusieurs colonnes.

Ne seriez-vous pas mieux d'utiliser un DataGridView à la place

0
James

Le MultiColumn ComboBox Control combine le contrôle Zone de texte à modifier et la vue en grille dans la liste déroulante pour afficher les données.

0
Leonards