richTextBox получает «дополнительную строку» в событии dataGridView CurrentCellChanged - PullRequest
0 голосов
/ 26 апреля 2018

У меня здесь три события, которые позволяют пользователю видеть полный текст ячейки в сетке данных, когда они меняют ячейки в реальном времени, и могут редактировать текст ячейки или richTextBox (если текстовое поле слишком большое). Я использую: dataGridView1_CellValueChanged_Handler - для обновления SQL и обновления DGV dataGridView1_CurrentCellChanged_Handler - для изменения текста в RTB richTextBox2_KeyDown_Handler - для обновления SQL и обновления DGV

Проблема в том, что при редактировании текста в RTB, когда все идет по кругу, я получаю дополнительную строку перед значением ячейки из DGV. Я проследил это и могу сказать, что происходит следующее:

  1. Введите ячейку для изменения в DGV, RTB обновляется значением
  2. Значение изменяется в RTB, затем нажмите ENTER для подтверждения изменения
  3. DGV CurrentCell [0,0], так как он обновлен, и у нас есть новый DGV
  4. Это значение заполняется в RTB
  5. Программно ячейка тока DGV возвращается к тому, что было до изменения
  6. RTB очищается и обновляется, у которого было значение [0,0] и вместо новое значение [x, y], оно имеет пробел перед новым значением.

Пока не знаете, как решить эту проблему, приглашены помощь или предложения.

Пример кода ниже:


private void handler_dataGridView1_CellValueChanged(object sender,DataGridViewCellEventArgs e){
    if(initialized){
        string query = "";
        string table = tabControl1.TabPages[(tabControl1.SelectedIndex)].Text;
        string column = (string)dataGridView1.Columns[e.ColumnIndex].HeaderText;
        int sqlID = (int)dataGridView1.Rows[e.RowIndex].Cells[0].Value;
        if(dataGridView1.CurrentCell.ValueType.ToString() == "System.DateTime"){
            DateTime valueD = Convert.ToDateTime(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value);
            query = (@"UPDATE [" + globalDatabase + @"].[dbo].[" + table + @"] SET [" + column +  @"] = '" + valueD +  @"' WHERE [ID] = '" + sqlID + @"'");
        }else if(dataGridView1.CurrentCell.ValueType.ToString() == "System.String"){
        string valueS = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
        query = (@"UPDATE [" + globalDatabase + @"].[dbo].[" + table + @"] SET [" + column +  @"] = '" + valueS +  @"' WHERE [ID] = '" + sqlID + @"'");
        }else{
            MessageBox.Show("Unhandled data type in method  handler_dataGridView1_CellValueChanged.");
        }
        WriteSQL(query);
        }else{}
    }
}
private void dataGridView1_CurrentCellChanged(object sender, EventArgs e){
    if(dataGridView1.CurrentCell != null && dataGridView1.CurrentCell.Value != null){
        MessageBox.Show(dataGridView1.CurrentCell.Value.ToString().Trim());
        MessageBox.Show(richTextBox2.Text.ToString().Trim());               
        richTextBox2.Clear();
        richTextBox2.Text = dataGridView1.CurrentCell.Value.ToString().Trim();
    }
}
private void richTextBox2_KeyDown_Handler(object sender, KeyEventArgs e){
    if(e.KeyValue == 13 && dataGridView1.CurrentCell.RowIndex != -1 && richTextBox2.Text.ToString().Trim() != dataGridView1.CurrentCell.Value.ToString().Trim()){
        int    col    = dataGridView1.CurrentCell.ColumnIndex;
        int    row    = dataGridView1.CurrentCell.RowIndex;
        string ID     = dataGridView1.CurrentRow.Cells[0].Value.ToString();
        string table  = tabControl1.TabPages[(tabControl1.SelectedIndex)].Text;
        string column = dataGridView1.Columns[dataGridView1.CurrentCell.ColumnIndex].HeaderText.ToString();
        string value  = richTextBox2.Text.ToString().Trim();
        string query  = @"UPDATE [" + globalDatabase + @"].[dbo].[" + table + @"] SET [" + column + @"] = '" + value + @"' WHERE [ID] = '" + ID + @"'";
        WriteSQL(query);
        RefreshDGV1();
        dataGridView1.CurrentCell = this.dataGridView1[col, row];
    }
}

Начальная точка, ячейка DGV активна, а текст в RTB

enter image description here

Значение изменяется в RTB, и нажимается клавиша ENTER. Значение становится текстом из значения ячейки DGV [0,0] при обновлении, которое будет изменено, чтобы стать обновленным значением ячейки [x, y].

enter image description here

То, что затем остается, это новое значение для этой ячейки с дополнительной строкой выше.

enter image description here


Я проследил события, и вот что в основном происходит:

Запуск приложения

dataGridView1_CellValueChanged_Handler
dataGridView1_CellValueChanged_Handler
dataGridView1_CellValueChanged_Handler

Выберите ячейку для изменения

dataGridView1_CellValueChanged_Handler

Изменить значение текста в RTB, нажать ENTER

richTextBox2_KeyDown_Handler
dataGridView1_CellValueChanged_Handler
dataGridView1_CellValueChanged_Handler
dataGridView1_CellValueChanged_Handler

Когда я редактирую ячейку из самой ячейки (инициируя dataGridView1_CellValueChanged_Handler), я не получаю эту проблему.

1 Ответ

0 голосов
/ 26 апреля 2018

Если вы не хотите, чтобы клавиша ввода создавала новую строку, вам следует отменить нажатие клавиши (e.Handled = true; // ОСТАНОВИТЬ ОБРАБОТКУ)

private void richTextBox2_KeyDown_Handler(object sender, KeyEventArgs e){
    if(e.KeyValue == 13 && dataGridView1.CurrentCell.RowIndex != -1 && richTextBox2.Text.ToString().Trim() != dataGridView1.CurrentCell.Value.ToString().Trim()){
        int    col    = dataGridView1.CurrentCell.ColumnIndex;
        int    row    = dataGridView1.CurrentCell.RowIndex;
        string ID     = dataGridView1.CurrentRow.Cells[0].Value.ToString();
        string table  = tabControl1.TabPages[(tabControl1.SelectedIndex)].Text;
        string column = dataGridView1.Columns[dataGridView1.CurrentCell.ColumnIndex].HeaderText.ToString();
        string value  = richTextBox2.Text.ToString().Trim();
        string query  = @"UPDATE [" + globalDatabase + @"].[dbo].[" + table + @"] SET [" + column + @"] = '" + value + @"' WHERE [ID] = '" + ID + @"'";
        WriteSQL(query);
        RefreshDGV1();
        dataGridView1.CurrentCell = this.dataGridView1[col, row];
        e.Handled = true; // STOP THE HANDLING
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...