у меня ситуация следующая: есть datagridview и richtextbox. В richtextbox необходимо передавать значение определённого поля таблицы из выбранной строки, и чтобы при редактировании richtextbox изменялось содержимое ячейки datagridview. Через
this.machine_dataTableAdapter.Fill(this.pydbDataSet.Machine_data);
не получилось, так как он возвращает в richtextbox значение только первой строки (если выбирать ячейки других строк, то richtextbox не изменяется).
Попробовал вписать следующее в событие CellClick:
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0)
{
richTextBox1.Text = dataGridView1.SelectedRows[0].Cells[3].Value.ToString();
}
}
Значение richtextbox меняется при выборе разных ячеек и его даже можно редактировать, но изменения не отображаются в ячейке выбранной строки.
UPD. Попробовал использовать databindings. Получил следующую ошибку (не могу понять как исправить): Не удается выполнить привязку к свойству или столбцу Характеристики в источнике данных. Имя параметра: dataMember'. Программа не запускается. До этого была ошибка два связывания в коллекции привязываются к одному свойству binding. Никак не могу понять где ошибка в использовании dataBindings. Прилагаю код:
public partial class Form1 : Form
{
private int r;
DataTable dataTable;
BindingSource bindingSource;
public Form1()
{
InitializeComponent();
dataTable = new DataTable();
bindingSource = new BindingSource();
//bindingSource.DataSource = dataTable;
machineDataBindingSource.DataSource = dataTable;
dataGridView1.CellValueChanged += dataGridView1_CellValueChanged;
machineDataBindingSource.BindingComplete += machineDataBindingSource_BindingComplete;
button_MachineData.Click += button_MachineData_Click;
}
private void button_MachineData_Click(object sender, EventArgs e)
{
r = 1;
string connectionString = "provider=Microsoft.ACE.OLEDB.12.0;Data Source=pydb.accdb";
OleDbConnection dbConnection = new OleDbConnection(connectionString);
dbConnection.Open();
dataGridView1.Rows.Clear();
dataGridView1.Columns.Clear();
while (dataGridView1.ColumnCount < 5)
{
dataGridView1.Columns.Add("Column1", "Код");
dataGridView1.Columns.Add("Column2", "Тип станка");
dataGridView1.Columns.Add("Column3", "Модель");
dataGridView1.Columns.Add("Column4", "Характеристики");
dataGridView1.Columns.Add("Column5", "Информация о станке");
}
string query = "SELECT * FROM [Machine data]";
OleDbCommand dbCommand = new OleDbCommand(query, dbConnection);
OleDbDataReader dbReader = dbCommand.ExecuteReader();
if (dbReader.HasRows == false)
{
MessageBox.Show("Данные не найдены", "Ошибка");
}
else
{
while (dbReader.Read())
{
dataGridView1.Rows.Add(dbReader["Код"], dbReader["Тип станка"], dbReader["Модель"], dbReader["Характеристики"], dbReader["Информация о станке"]);
}
}
dataGridView1.DataSource = bindingSource;
richTextBox1.DataBindings.Add(
nameof(richTextBox1.Text), bindingSource, "Характеристики", true, DataSourceUpdateMode.OnPropertyChanged);
dbReader.Close();
dbConnection.Close();
}
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
//bindingSource.EndEdit();
}
private void machineDataBindingSource_BindingComplete(object sender, BindingCompleteEventArgs e)
{
if (e.BindingCompleteContext == BindingCompleteContext.DataSourceUpdate && e.Exception == null)
{
e.Binding.BindingManagerBase.EndCurrentEdit();
}
.
machineDataBindingSource.DataSource = dataTable;- зачем вы привязываете к ТАБЛИЦЕ? Посмотрите видео https://youtu.be/U1eypjtM8JI или загуглите "c# inotifypropertychanged winforms". Вот ещё ссылка на пример по реализации данного интерфейса https://ru.stackoverflow.com/questions/1413761/%d0%a0%d0%b5%d1%84%d0%b0%d0%ba%d1%82%d0%be%d1%80%d0%b8%d0%bd%d0%b3-%d0%ba%d0%be%d0%b4%d0%b0-%d0%b2%d1%8b%d0%b2%d0%be%d0%b4%d0%b0-%d0%b4%d0%b0%d0%bd%d0%bd%d1%8b%d1%85-%d0%b2-datagriview/1413988#1413988 – Frehzy May 30 '22 at 17:18machineDataBindingSourceиbindingSource. Вы их явно путаете в коде. Удалите один из них. – Alexander Petrov May 31 '22 at 09:07