DataGridViewComboBoxCell показывает элемент Value, а не элемент Display после выбора

Итак, я работал над DataGridView, где пользователь может изменить значение одной ячейки в строке, которая затем изменит тип другой ячейки в той же строке на DataGridViewComboBoxCell или обратно на DataGridViewTextBoxCell. И я могу заставить поле со списком отображаться так.

Dictionary<long, string> InspectionTools = new Dictionary<long, string>();

private void DynamicControlsDGV_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    if (DynamicControlsDGV.Columns[e.ColumnIndex].Name == "typeDataGridViewTextBoxColumn")
    {
        var type = int.Parse(DynamicControlsDGV[1, e.RowIndex].Value.ToString());
        if (type == 8)
        {
            var CBCell = new DataGridViewComboBoxCell();
            CBCell.DataSource = InspectionTools.ToList();
            CBCell.ValueMember = "Key";
            CBCell.DisplayMember = "Value";
            CBCell.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox;
            DynamicControlsDGV[7, e.RowIndex] = CBCell;
        }
        else
        {
            var CBCell = new DataGridViewTextBoxCell();
            DynamicControlsDGV[7, e.RowIndex] = CBCell;
        }
    }
}

Однако, несмотря на то, что я вижу все значения, когда я нажимаю на ячейку со списком, когда я выбираю тот, который я хочу, ячейка отображает элемент значения (ключ/идентификатор), а не элемент отображения (значение/имя). Как показано ниже:

Что происходит во время выполнения

Есть ли способ переопределить форматирование ячейки, чтобы отображаемый текст не возвращался к идентификатору?

Минимальный, полный и проверяемый пример

После создания MCVE я обнаружил, что проблема где-то в моем коде. Вот MSVE (который отлично работает), который я сделал для справки:

Код позади:

public partial class Form1 : Form
{
    public List<KeyValuePair<long, string>> options2 = new List<KeyValuePair<long, string>>();
    public Form1()
    {
        InitializeComponent();
        var options = new List<KeyValuePair<long, string>>();
        options.Add(new KeyValuePair<long, string>(1, "text"));
        options.Add(new KeyValuePair<long, string>(2, "combo"));

        options2 = new List<KeyValuePair<long, string>>();
        options2.Add(new KeyValuePair<long, string>(1, "option 1"));
        options2.Add(new KeyValuePair<long, string>(2, "option 2"));

        ((DataGridViewComboBoxColumn)dataGridView1.Columns[0]).DataSource = options;
        ((DataGridViewComboBoxColumn)dataGridView1.Columns[0]).ValueMember = "Key";
        ((DataGridViewComboBoxColumn)dataGridView1.Columns[0]).DisplayMember = "Value";
        for (int i = 0; i < 5; i++)
        {
            DataGridViewRow row = (DataGridViewRow)dataGridView1.Rows[0].Clone();
            dataGridView1.Rows.Add(row);
        }
    }

    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex==0)
        {
            try
            {
                if (int.Parse(dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString()) == 2)
                {
                    var CBCell = new DataGridViewComboBoxCell();
                    CBCell.DataSource = options2;
                    CBCell.ValueMember = "Key";
                    CBCell.DisplayMember = "Value";
                    CBCell.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox;
                    dataGridView1[1, e.RowIndex] = CBCell;
                }
                else
                {
                    var CBCell = new DataGridViewTextBoxCell();
                    dataGridView1[1, e.RowIndex] = CBCell;
                }
            }
            catch
            {
            }
        }
    }
}

Дизайнер:

partial class Form1
{
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    #region Windows Form Designer generated code

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
        this.dataGridView1 = new System.Windows.Forms.DataGridView();
        this.Column2 = new System.Windows.Forms.DataGridViewComboBoxColumn();
        this.Column3 = new System.Windows.Forms.DataGridViewTextBoxColumn();
        ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
        this.SuspendLayout();
        // 
        // dataGridView1
        // 
        this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
        this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
        this.Column2,
        this.Column3});
        this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
        this.dataGridView1.Location = new System.Drawing.Point(0, 0);
        this.dataGridView1.Name = "dataGridView1";
        this.dataGridView1.Size = new System.Drawing.Size(879, 564);
        this.dataGridView1.TabIndex = 0;
        this.dataGridView1.CellValueChanged += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridView1_CellValueChanged);
        // 
        // Column2
        // 
        this.Column2.HeaderText = "2";
        this.Column2.Name = "Column2";
        // 
        // Column3
        // 
        this.Column3.HeaderText = "3";
        this.Column3.Name = "Column3";
        // 
        // Form1
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(879, 564);
        this.Controls.Add(this.dataGridView1);
        this.Name = "Form1";
        this.Text = "Form1";
        ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
        this.ResumeLayout(false);

    }

    #endregion

    private System.Windows.Forms.DataGridView dataGridView1;
    private System.Windows.Forms.DataGridViewComboBoxColumn Column2;
    private System.Windows.Forms.DataGridViewTextBoxColumn Column3;
}

Еще одно обновление

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


person Mark    schedule 30.05.2018    source источник
comment
Не удалось воспроизвести проблему. Попробуйте опубликовать минимально воспроизводимый пример.   -  person Reza Aghaei    schedule 30.05.2018
comment
Я правильно понимаю: одна ячейка работает, а другая нет? Таким образом, поиск разницы должен быть ключом.   -  person TaW    schedule 30.05.2018
comment
Столбец имени инструмента по умолчанию является текстовым столбцом. Я меняю одну ячейку на comboboxcell (3). Отображается поле со списком, и при нажатии на него отображаются правильные значения. После того, как значение было выбрано, оно отображает идентификатор (элемент значения) вместо имени (элемент отображения) в части 4. Кстати, он остается в виде текста, пока я не щелкну другую ячейку, поэтому я считаю, что что-то в форматировании ячейки заставляет его форматироваться как по умолчанию ячейка текстового поля.   -  person Mark    schedule 30.05.2018
comment
Ты был прав, Реза, в меньшем масштабе это сработало. Я собираюсь просмотреть свойства datagridview на случай, если одно из них может быть причиной этого.   -  person Mark    schedule 31.05.2018


Ответы (1)


Представление сетки данных было основано на классе, созданном с помощью LINQ to SQL. Поэтому тип столбца был установлен как строка вместо объекта по умолчанию. После изменения источника данных для поля со списком на пары строк, строки ячеек стали правильно отформатированы.

person Mark    schedule 30.05.2018