DataGridViewComboBoxCell показывает элемент значения, а не элемент отображения после выбора - PullRequest
0 голосов
/ 30 мая 2018

Итак, я работал над 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;
        }
    }
}

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

What happens during run time

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

Пример минимального, полного и проверяемого значения

После создания 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;
}

Другое обновление

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

1 Ответ

0 голосов
/ 31 мая 2018

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

...