0

у меня ситуация следующая: есть 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();
           }

Используемые объекты datasource/bindingsource.

  • Привяжите данные к одному свойству. При изменении какого-либо, второе будет автоматически изменяться, благодаря реализации интерфейса INotifyPropertyChanged https://ru.stackoverflow.com/questions/1199457/%D0%9F%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B2-datagridview/1199692#1199692 – Frehzy May 30 '22 at 08:44
  • https://ru.stackoverflow.com/a/911728/184217 – Alexander Petrov May 30 '22 at 08:47
  • @AlexanderPetrov Я попробовал использовать data source, но получилось... не получилось. Обновил вопрос с пояснением своих ошибок, можете сказать в чём проблема? – m4d_h4tter May 30 '22 at 13:39
  • @Frehzy Такая же просьба и к вам, пожалуйста – m4d_h4tter May 30 '22 at 16:27
  • 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:18
  • У вас есть machineDataBindingSource и bindingSource. Вы их явно путаете в коде. Удалите один из них. – Alexander Petrov May 31 '22 at 09:07

0 Answers0