DataGridViewComboBoxCell не работает правильно
У меня есть очень простой пример приложения ниже. Это относится к Windows Forms и должно иметь соответствие для созданного в конструкторе с DataGridView, который имеет два столбца: имя и отдел. Отдел-это DataGridViewComboBoxCell.
В таблице перечислены данные, как и ожидалось, а в поле со списком перечислены его элементы, как и ожидалось. Однако я не могу получить данные, выбранные в поле со списком, привязанным к элементу DataBoundItem сетки. Например, при первом запуске приложения Мой единственный объект Person имеет DepartmentID = 2, который соответствует значению в поле со списком, но в поле со списком ничего не выбрано. Когда что-то выбрано в поле со списком, оно не отражается в объекте Person.
Существует закомментированная строка кода для установки ValueMember, но это вызывает ошибку "поле с именем DeptID не существует".
Важно, чтобы оба набора данных были ArrayList и не DataTable.
Как завершить привязку между строковыми данными и выбором поля со списком?
--- Полный код проекта приведен ниже ---
using System; using System.Collections.Generic; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace TestApp { public partial class Form1 : Form { private ArrayList personList = new ArrayList(); private ArrayList deptList = new ArrayList(); BindingSource m_BindSource = new BindingSource(); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { personList.Add(new Person("Tim", 2)); deptList.Add(new Department("A", 1)); deptList.Add(new Department("B", 2)); deptList.Add(new Department("C", 3)); DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)grid1.Columns[1].CellTemplate; cell.DataSource = deptList; cell.DisplayMember = "DeptName"; //cell.ValueMember = "DeptID"; // "Field called DeptID does not exist" try { m_BindSource.DataSource = null; m_BindSource.DataSource = personList; grid1.DataSource = m_BindSource; } catch (Exception ex) { ex.GetType(); MessageBox.Show(ex.Message); } } } public class Person { public Person(String name, int deptID) { PersonName = name; DepartmentID = deptID; } private String m_PersonName; public String PersonName { get { return m_PersonName; } set { m_PersonName = value; } } private int m_DepartmentID; public int DepartmentID { get { return m_DepartmentID; } set { m_DepartmentID = value; } } } public class Department { public Department(String name, int deptID) { DeptName = name; DepartmentID = deptID; } private String m_DeptName; public String DeptName { get { return m_DeptName; } set { m_DeptName = value; } } private int m_DepartmentID; public int DepartmentID { get { return m_DepartmentID; } set { m_DepartmentID = value; } } } }
Sergey Alexandrovich Kryukov
Просто примечание: никогда не используйте ArrayList в новой разработке, всегда используйте System.Коллекции.Универсальный.Список< и GT;
—СА