Привязка DataGridViewComboBoxCell - “значение не допустима”

.*.name 

это должно делать вашу работу. У меня работает.

28
задан Cyril Gandon 8 November 2013 в 14:51
поделиться

3 ответа

Мне удалось найти решение вскоре после регистрации вопроса. Для кого-либо еще:

проблема состояла в том, что я пытался присвоиться DataGridViewComboBoxCell.Value к объекту, ожидая что, потому что Ячейка была связана с источником данных, что она автоматически найдет объект в источнике и обновлении.

Это на самом деле не имело место, на самом деле необходимо установить значение, равное что ValueMember свойство для него для корректного обновления значения и привязки. Я полагаю, что использовал свойство 'Name' и для ValueMember и для DisplayMember (средства управления как рендеринг в ячейке) настолько устанавливающий Значение к interface.ToString() (а не интерфейсный экземпляр) работает на большинство случаев. Тогда я ловлю и игнорирую любые исключения DataError, которые происходят, в то время как я меняю источник.

33
ответ дан Ian 28 November 2019 в 03:03
поделиться

Вот полный пример с канонической формой и DataGridView добавлен через разработчика:

Установка и привязка:

private void Form1_Load(object sender, EventArgs e)
{

    var colors = new List<Code>()
    {
        new Code() {Value= "R", Text = "Red"},
        new Code() {Value= "G", Text = "Green"},
        new Code() {Value= "B", Text = "Blue"}
    };

    var users = new List<User>()
    {
        new User() {Name = "Briana", FavoriteColor = "B"},
        new User() {Name = "Grace", FavoriteColor = "G"}
    };

    var colorCol = new DataGridViewComboBoxColumn();
    colorCol.DataSource = colors;
    colorCol.DisplayMember = "Text";
    colorCol.ValueMember = "Value";
    colorCol.DataPropertyName = "FavoriteColor";

    dataGridView1.Columns.Add(colorCol);
    dataGridView1.DataSource = users;

}

Некоторые классы:

public class Code
{
    public string Value { get; set; }
    public string Text { get; set; }
}

public class User
{
    public string Name { get; set; }
    public string FavoriteColor { get; set; }
}
0
ответ дан 28 November 2019 в 03:03
поделиться

После нескольких часов испытаний я наконец нашел решение, которое работает.

// Create a DataGridView
System.Windows.Forms.DataGridView dgvCombo = new System.Windows.Forms.DataGridView();

// Create a DataGridViewComboBoxColumn
System.Windows.Forms.DataGridViewComboBoxColumn colCombo = new 

System.Windows.Forms.DataGridViewComboBoxColumn();

// Add the DataGridViewComboBoxColumn to the DataGridView
dgvCombo.Columns.Add(colCombo);

// Define a data source somewhere, for instance:
public enum DataEnum
{
    One,
    Two,
    Three
}

// Bind the DataGridViewComboBoxColumn to the data source, for instance:
colCombo.DataSource = Enum.GetNames(typeof(DataEnum));

// Create a DataGridViewRow:
DataGridViewRow row = new DataGridViewRow();

// Create a DataGridViewComboBoxCell:
DataGridViewComboBoxCell cellCombo = new DataGridViewComboBoxCell();

// Bind the DataGridViewComboBoxCell to the same data source as the DataGridViewComboBoxColumn:
cellCombo.DataSource = Enum.GetNames(typeof(DataEnum));

// Set the Value of the DataGridViewComboBoxCell to one of the values in the data source, for instance:
cellCombo.Value = "Two";
// (No need to set values for DisplayMember or ValueMember.)

// Add the DataGridViewComboBoxCell to the DataGridViewRow:
row.Cells.Add(cellCombo);

// Add the DataGridViewRow to the DataGridView:
dgvCombo.Rows.Add(row);

// To avoid all the annoying error messages, handle the DataError event of the DataGridView:
dgvCombo.DataError += new DataGridViewDataErrorEventHandler(dgvCombo_DataError);

void dgvCombo_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
    // (No need to write anything in here)
}

Вот и все.

3
ответ дан 28 November 2019 в 03:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: