Значение параметра DataGridViewComboBoxCell вручную, значение недопустимо - PullRequest
3 голосов
/ 02 мая 2010

вот мой код:

        private class Person
        {
            private string myName;
            private int myValue;

            public Person(string name, int value)
            {
                myName = name; 
                myValue = value;
            }
            public override string ToString()
            {
                return myName;
            }

            public string Name
            {
                get { return myName; }
                set { myName = value; }
            }

            public int Value
            {
                get { return myValue; }
                set { myValue = value; }
            }
        }

Я использую его для заполнения DataGridViewComboBoxCell следующим образом:

myDataGridViewComboBoxCell.ValueMember = "Value";
myDataGridViewComboBoxCell.DisplayMember = "Name";
myDataGridViewComboBoxCell.Items.Add(new Person("blabla", someNumber));

Все, что я хочу сейчас сделать - это выбрать человека:

myDataGridViewComboBoxCell.Value = someNumber;

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

Ответы [ 4 ]

10 голосов
/ 29 июня 2010

Вместо добавления к DataGridViewComboBoxColumn.Items вам нужно установить DataGridViewComboBoxColumn.DataSource в список лиц и установить DataGridViewComboBoxColumn.ValueType = typeof(Person).

Должен сделать это. Хотя с тех пор, как вы задали этот вопрос, прошло уже два месяца, возможно, ваша проблема утратила актуальность.

2 голосов
/ 03 мая 2011

У меня тоже была эта проблема. Я временно решил это довольно грязно.

Свойство Value объекта DataGridViewComboBoxCell ДОЛЖНО быть одним из значений, содержащихся в свойстве Items (или связанном DataSource)

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

Мое грязное исправление заключалось в обработке события DataGridView.DataError и заполнении (снова) DataGridViewComboBoxCell.Items на этом этапе.

Private Sub myDataGridView_DataError(ByVal sender As System.Object, _ 
                ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) _
                Handles dgvServicesToTransfer.DataError

        'Dirty Fix 
        If e.ColumnIndex = myComboBoxColumn.Index Then
            Dim row As DataGridViewRow = dgvServicesToTransfer.Rows(e.RowIndex)
            ' Fill in your DataGridViewComboBoxCell's Items here:
            ' ...
            ' ...
            If allWentWell Then
                ' Cancel the exception
                e.ThrowException = False
            End If
        End If

    End Sub
End Class

PS: Извините за ответ VB.Net, если у вас есть проблемы с "переводом", просто спросите.

0 голосов
/ 06 марта 2012

У меня была похожая проблема. Как бы странно это ни звучало, я решил эту проблему, сохранив добавление только строк в DataGridViewComboBoxCell.Items. Добавление объектов (с красиво реализованным ToString () и т. Д.) Вызывало проблемы с «ошибкой данных», но добавление строк работало нормально.

0 голосов
/ 03 февраля 2012

Попробуйте использовать enum для имени вашей персоны

enum person
{ 
 John,
 Andy,
 Sepehr
};

используйте это перечисление, чтобы добавить имя к вашему списку

myDataGridViewComboBoxCell.Items.Add ( person.andy.tostring(),number );

теперь, когда вы хотите установить vale, используйте enum снова. Ты исправишь твою проблему.

myDataGridViewComboBoxCell.Value = person.Andy.ToString() ;

Запомните использовать -> ToString()! Работал на меня! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...