Постоянный выбор пользователя в DataGridViewComboBoxColumn в Winform - PullRequest
1 голос
/ 07 сентября 2011

У меня проблема с сохранением выбора пользователя в DataGridViewComboBoxColumn внутри DataGridView в Winform. Как только я покидаю ComboBox, выбор исчезает.

Я нашел некоторые ответы на проблему, например, установил SelectedIndex в -1, но это не сработало. Пожалуйста, укажите мне правильное направление.

Заранее спасибо.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        // Create DataTable.
        DataColumn classIdColumn = new DataColumn("Class", typeof(string));
        _schoolTable = new DataTable("School");
        _schoolTable.Columns.AddRange(new[] { classIdColumn });
        DataRow row = _schoolTable.NewRow();
        row["Class"] = "yr 5";
        _schoolTable.Rows.Add(row);

        // Bind DataGridView to DataTable, and add ComboBoxColumn.
        dataGridView1.DataSource = _schoolTable;
        DataGridViewComboBoxColumn listCol = new DataGridViewComboBoxColumn();
        listCol.DisplayIndex = 1;
        listCol.DataSource = GetChoices();
        listCol.DisplayMember = "Category";
        listCol.ValueMember = "Number";
        listCol.DefaultCellStyle.NullValue = "None";
        dataGridView1.Columns.Add(listCol);
    }

    private DataTable _schoolTable;

    private static List<IHuman> GetChoices()
    {
        return Choices;
    }

    private static readonly List<IHuman> Choices = new List<IHuman>(){ new Student(), new Teacher() };

    private interface IHuman
    {
        int Number { get; set; }
        string Category { get; }
    }

    private class Student : IHuman
    {
        public int Number { get; set; }
        public string Category { get { return "student"; } }
    }

    private class Teacher : IHuman
    {
        public int Number { get; set; }
        public string Category { get { return "teacher"; } }
    }
}

1 Ответ

0 голосов
/ 14 сентября 2011

Первоначальной причиной проблемы является то, что вы не указываете какие-либо значения для свойства Number в своих объектах IHuman.

Если вы измените строку кода, в которой вы создаете список, на что-то вроде:

private static readonly List<IHuman> Choices = new List<IHuman>() { new Student() {Number = 0}, new Teacher() {Number = 1} };

Или поместите значения по умолчанию в свойство Number каждого объекта, который реализует IHuman, как для свойства Category, тогда ваш комбинированный список должен работать правильно.


Кроме того, вы можете сделатькод, с которым немного проще работать.

Первое, что вы можете сделать, это добавить столбец в таблицу данных для поддержки привязки данных в столбце комбинированного списка, что позволит вам просто посмотреть на таблицу данных, чтобы узнать, что было выбрано.Код для этого приведен ниже:

DataColumn classIdColumn = new DataColumn("Class", typeof(string));
_schoolTable = new DataTable("School");

//Create a new column in the data table of type int
DataColumn humanIdColumn = new DataColumn("HumanId", typeof(int));

_schoolTable.Columns.AddRange(new[] { classIdColumn });
_schoolTable.Columns.AddRange(new[] { humanIdColumn });

DataRow row = _schoolTable.NewRow();
row["Class"] = "yr 5";
_schoolTable.Rows.Add(row);

// Bind DataGridView to DataTable, and add ComboBoxColumn.
dataGridView1.DataSource = _schoolTable;
DataGridViewComboBoxColumn listCol = new DataGridViewComboBoxColumn();
listCol.DisplayIndex = 1;
listCol.DataSource = GetChoices();
listCol.DisplayMember = "Category";
listCol.ValueMember = "Number";
//Set the DataPropertyName on the comboboxcolumn to enable databinding
listCol.DataPropertyName = "HumanId";
listCol.DefaultCellStyle.NullValue = "None";
dataGridView1.Columns.Add(listCol);

//Hide the autogenerated column HumanId - we only have it for the databinding
dataGridView1.Columns["HumanId"].Visible = false;

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

...