Привязка (databinding) textbox к enum

Есть таблица dataGridView1, связанная с БД (Sql Server) через созданный метод

List<MachineData> machines = new List<MachineData>(); 
private void MachineBinding()
{
    dataGridView1.DataSource = machines;
    dataGridView1.Columns[0].Visible = true; // просто чтобы скрыть колонку с ID
}

Класс MachineData выглядит следующим образом:

    public int MachineID { get; set; }
    public int MachineType { get; set; }
    public string Model { get; set; }
    public string Features { get; set; }
    public string About { get; set; }

Существуют текстобксы, берущие значения из этой таблицы (также привязал их)

private void TextBoxBindings()
{
    label_ID.DataBindings.Add(nameof(label_ID.Text), machines, "MachineID", true, DataSourceUpdateMode.OnPropertyChanged);
    if (dataGridView1.DataSource == machines)
    {
        textBox1.DataBindings.Add(nameof(TextBox.Text), machines, "MachineType", true, DataSourceUpdateMode.OnPropertyChanged);
        textBox2.DataBindings.Add(nameof(TextBox.Text), machines, "Model", true, dataSourceUpdateMode.OnPropertyChanged);
        textBox3.DataBindings.Add(nameof(TextBox.Text), machines, "Features", true, DataSourceUpdateMode.OnPropertyChanged);
        textBox4.DataBindings.Add(nameof(TextBox.Text), machines, "About", true, DataSourceUpdateMode.OnPropertyChanged);
    }

Вопрос состоит в следующем: в textbox1 выводит цифру "2" (которая является ID), а в таблице вместо "2" стоит слово (т.е. вместо ключа таблицы, отображается соответствующее этому ID слово). Эту вещь реализовал через enum (как отдельный класс) и CellFormatting у dtg:

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (dataGridView1.Columns[e.ColumnIndex].Name == "MachineType")
    {
        MachineType.Machine_Type enumValue = (MachineType.Machine_Type)(int)e.Value;
        string enumstring = enumValue.ToString(); 
        e.Value = enumstring;
    }
}

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

textBox1.Text = Enum.GetValues(typeof(MachineType.Machine_Type)).ToString();

Ответы (1 шт):

Автор решения: Alexander Petrov

Допустим, имеется перечисление:

public enum MachineType { A, B, C, D, E };

Имеется модель:

public class MachineData
{
    //[Browsable(false)]
    [ReadOnly(true)]
    public int MachineID { get; set; }
    public MachineType MachineType { get; set; }
    public string Model { get; set; }
    public string Features { get; set; }
    public string About { get; set; }
}

Свойству MachineType даём тип перечисления. Не нужно его делать int.

Можно использовать атрибут [Browsable(false)], чтобы данное свойство не отображалось в гриде.
Можно использовать атрибут [ReadOnly(true)], чтобы данное свойство стало нередактируемым.

Перечисление привяжем к комбобоксам, а не текстбоксам. Это даст пользователю возможность выбирать из списка конкретные значения, а не вводить непонятные числа.

Вот полный код приложения. Все контролы созданы в конструкторе.
Я слегка изменил нейминг.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace WinForm
{
    public partial class Form1 : Form
    {
        DoubleBufferedDataGridView dataGridView;
        List<MachineData> machines = new List<MachineData>();

        Label labelID;
        ComboBox comboBoxMachineType;
        TextBox textBoxModel;
        TextBox textBoxFeatures;
        TextBox textBoxAbout;

        public Form1()
        {
            //InitializeComponent();

            Size = new Size(800, 700);

            dataGridView = new DoubleBufferedDataGridView { Parent = this, Dock = DockStyle.Top, Height = 400 };

            for (int i = 0; i < 5; i++)
                machines.Add(new MachineData { MachineID = i, MachineType = (MachineType)i, Model = "M" + i, Features = "F" + i, About = "A" + i });

            labelID = new Label { Parent = this, Top = dataGridView.Bottom + 20 };

            comboBoxMachineType = new ComboBox { Parent = this, Top = labelID.Bottom + 20 };

            textBoxModel = new TextBox { Parent = this, Top = comboBoxMachineType.Bottom + 20 };
            textBoxFeatures = new TextBox { Parent = this, Top = textBoxModel.Bottom + 20 };
            textBoxAbout = new TextBox { Parent = this, Top = textBoxFeatures.Bottom + 20 };

            DataBinding();
            ControlsBinding();
        }
        DataGridViewComboBoxColumn CreateComboBoxWithEnums()
        {
            var combo = new DataGridViewComboBoxColumn();
            combo.DataSource = Enum.GetValues(typeof(MachineType));
            combo.DataPropertyName = nameof(MachineData.MachineType);
            combo.HeaderText = "Machine Type";
            return combo;
        }
        private void DataBinding()
        {
            dataGridView.DataSource = machines;
            dataGridView.Columns.RemoveAt(1);
            dataGridView.Columns.Insert(1, CreateComboBoxWithEnums());

            comboBoxMachineType.DataSource = Enum.GetValues(typeof(MachineType));
        }
        private void ControlsBinding()
        {
            labelID.DataBindings.Add(nameof(Label.Text), machines, nameof(MachineData.MachineID), true, DataSourceUpdateMode.OnPropertyChanged);

            comboBoxMachineType.DataBindings.Add(nameof(TextBox.Text), machines, nameof(MachineData.MachineType), true, DataSourceUpdateMode.OnPropertyChanged);

            textBoxModel.DataBindings.Add(nameof(TextBox.Text), machines, nameof(MachineData.Model), true, DataSourceUpdateMode.OnPropertyChanged);
            textBoxFeatures.DataBindings.Add(nameof(TextBox.Text), machines, nameof(MachineData.Features), true, DataSourceUpdateMode.OnPropertyChanged);
            textBoxAbout.DataBindings.Add(nameof(TextBox.Text), machines, nameof(MachineData.About), true, DataSourceUpdateMode.OnPropertyChanged);
        }
    }
}

Думаю, это то, что вам нужно.
Событие CellFormatting не используется.

public class DoubleBufferedDataGridView : DataGridView
{
    protected override bool DoubleBuffered => true;
}
→ Ссылка