Подтвердить что ты не робот

Выделение WinForms с несколькими столбцами (С#)?

Я использую в настоящее время следующий код для заполнения combobox:

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

Есть ли способ отображения нескольких столбцов. Я попробовал "Auftragsnummer, Kunde, Beschreibung" для DisplayMember, но это не сработало.

4b9b3361

Ответ 2

Здесь есть статья о MSDN, описывающая, как можно создать многоколоночный ComboBox.

Как создать раскрывающийся список с несколькими столбцами для комбинированного поля в Windows Forms

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


Исходный код из загрузки для VB из вышеупомянутого Microsoft Link, который можно легко адаптировать для работы с ListBox, а также с 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

Ответ 3

Вы можете добавить в свой набор данных фиктивный столбец (Description) и использовать его как DisplayMember в привязке данных со списком.

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

Простой и работает.

Ответ 4

Он не доступен из коробки в .NET(будь то Windows-формы или asp.net dropdownlist) Выделите этот элемент проекта кода для справки о том, как создать свой собственный. (есть еще больше нагрузок).

Проект кода

Ответ 6

У вас не может быть поле со списком нескольких столбцов.

Не могли бы вы лучше использовать DataGridView вместо

Ответ 7

Быстрое решение
Насколько мне известно, Datatables должны быть partical-классами.

  • Создайте 2-й файл для вашего datatable MyDataTable.custom.cs
  • Добавить свойство string в класс частичного datatable, называемый "DisplayProperty"
  • В этом свойстве верните string.format( "{0} {1} {2}", Auftragsnummer, Kunde, Подробно о продукте);
  • Привяжите свой Datamember к DisplayProperty

Ответ 8

MultiColumn ComboBox Control объединяет элемент управления текстовым полем для редактирования и вид сетки в выпадающем списке для отображения данных.

Ответ 9

легко и быстро! посмотри на это...

combobox.Datasource = 
entities.tableName.Select(a => a.Coulmn1 + " " + a.Coulmn2).ToList();