Привязка (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 шт):
Допустим, имеется перечисление:
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;
}