Проблема с использованием DataGridViewComboboxColumn для ввода - PullRequest
0 голосов
/ 14 февраля 2012

У меня есть представление данных, которое я использую для ввода данных. Я делал это раньше со всеми текстовыми столбцами, и он работал отлично Но теперь я хочу, чтобы один из столбцов был комбинированным списком данных, чтобы пользователь мог выбирать параметры. Когда я делаю это, результирующий источник данных gridview заканчивается пустыми строками (но нужным количеством). Что мне не хватает?

Вот код:

 DataGridViewComboBoxColumn cboCategory = new DataGridViewComboBoxColumn();
 {
     cboCategory.HeaderText = "Category";
     cboCategory.DataSource = downtimeCategories;
     cboCategory.DisplayMember = "Name";
     cboCategory.ValueMember = "CategoryID";
     cboCategory.DataPropertyName = "CategoryID";

     gridDowntime.Columns.Add(cboCategory);
 }

Затем код для получения источника данных gridview:

DataTable dt = (gridDowntime.DataSource as DataTable);

Каждый раз, когда я получаю таблицу с правильным количеством строк, но все строки пусты (хотя это длинные строки, визуализатор набора данных должен прокрутить, чтобы показать всю ячейку). Как я могу найти ошибку и исправить?

РЕДАКТИРОВАТЬ: Есть ли какая-то конкретная дополнительная информация, которую я должен предоставить здесь?

1 Ответ

1 голос
/ 15 февраля 2012

Вот простой пример проекта, который я только что приготовил.

Ключевой момент, который, я думаю, вы ошибаетесь, заключается в том, что свойство DataPropertyName в DataGridViewComboboxColumn должно ссылаться на источник данных DataGridView, а не на столбец.

public Form1()
{
    InitializeComponent();

    DataTable dt = new DataTable("Customers");
    DataColumn dc;

    dc = new DataColumn();
    dc.DataType = typeof(int);
    dc.ColumnName = "CustomerID";

    dt.Columns.Add(dc);
    dt.Columns.Add(new DataColumn("LastName"));
    dt.Columns.Add(new DataColumn("FirstName"));
    // Concatenation of first and last names 
    dt.Columns.Add(new DataColumn("FullName"));
    dt.Columns.Add(new DataColumn("Address"));
    dt.Columns.Add(new DataColumn("City"));
    dt.Columns.Add(new DataColumn("State"));
    dt.Columns.Add(new DataColumn("Zip"));
    dt.Columns.Add(new DataColumn("Phone"));

    dc = new DataColumn();
    dc.DataType = typeof(DateTime);
    dc.ColumnName = "LastPurchaseDate";
    dt.Columns.Add(dc);

    dc = new DataColumn();
    dc.DataType = typeof(int);
    dc.ColumnName = "CustomerType";
    dt.Columns.Add(dc);

    // Populate the table 
    dt.Rows.Add(2, "Baggins", "Bilbo", "Baggins, Bilbo", "Bagshot Row #1", "Hobbiton", "SH", "00001", "555-2222", DateTime.Parse("24/9/2008"), 1);
    dt.Rows.Add(1, "Baggins", "Frodo", "Baggins, Frodo", "Bagshot Row #2", "Hobbiton", "SH", "00001", "555-1111", DateTime.Parse("14/9/2008"), 1);
    dt.Rows.Add(6, "Bolger", "Fatty", "Bolger, Fatty", "ProudFeet Creek", "Hobbiton", "SH", "00001", "555-1111", DateTime.Parse("14/9/2008"), 1); 
    dt.Rows.Add(4, "Elessar", "Aragorn", "Elessar, Aragorn", "Citadel", "Minas Tirith", "Gondor", "00000", "555-0000", DateTime.Parse("14/9/2008"), 4);
    dt.Rows.Add(5, "Evenstar", "Arwin", "Evenstar, Arwin", "Citadel", "Minas Tirith", "Gondor", "00000", "555-0001", DateTime.Parse("23/9/2008"), 4);
    dt.Rows.Add(3, "Greyhame", "Gandalf", "Grayhame, Gandalf", DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, 3);

    DataGridViewComboBoxColumn cboCategory = new DataGridViewComboBoxColumn();

    List<CustomerType> customerTypes = new List<CustomerType> { new CustomerType { Id = 1, Name = "Good" }, new CustomerType { Id = 4, Name = "Bad" }, new CustomerType { Id = 3, Name = "Ugly" } };

    cboCategory.HeaderText = "Customer Type";
    cboCategory.DataSource = customerTypes;
    cboCategory.DisplayMember = "Name";
    cboCategory.ValueMember = "Id";
    cboCategory.DataPropertyName = "CustomerType";

    dataGridView1.Columns.Add(cboCategory);

    dataGridView1.DataSource = dt;

}

Немного бесполезного - схватил этот код с данными прямо из сети. Но ключевой частью здесь является установка свойств для столбца со списком.

Мой источник данных - это список объектов типа клиента:

public class CustomerType
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Так что мне нужно установить DisplayMember для столбца в «Имя» и ValueMember в «Id», так как это ссылается на источник данных столбцов. Однако для DataPropertyName было установлено значение «CustomerType», которое является именем столбца в DataTable, который мы связали с DataGridView.


Так что после небольшого обсуждения в чате выясняется, что вышеприведенное верно, но вам также необходимо убедиться, что типы столбцов идентификаторов совпадают.

Таблица данных, используемая для предоставления данных в столбец выпадающего списка, была сгенерирована из запроса sql и содержала столбец id типа. Ваш резервный источник данных имел столбец id, сделанный так:

dt.Columns.Add(new DataColumn("Category")); 

По умолчанию это столбец типа string. Попробуйте вместо этого что-то вроде:

downtimeEntries.Columns.Add("Category", typeof(int));
...