У меня здесь три события, которые позволяют пользователю видеть полный текст ячейки в сетке данных, когда они меняют ячейки в реальном времени, и могут редактировать текст ячейки или richTextBox (если текстовое поле слишком большое).
Я использую:
dataGridView1_CellValueChanged_Handler - для обновления SQL и обновления DGV
dataGridView1_CurrentCellChanged_Handler - для изменения текста в RTB
richTextBox2_KeyDown_Handler - для обновления SQL и обновления DGV
Проблема в том, что при редактировании текста в RTB, когда все идет по кругу, я получаю дополнительную строку перед значением ячейки из DGV. Я проследил это и могу сказать, что происходит следующее:
- Введите ячейку для изменения в DGV, RTB обновляется значением
- Значение изменяется в RTB, затем нажмите ENTER для подтверждения изменения
- DGV CurrentCell [0,0], так как он обновлен, и у нас есть новый DGV
- Это значение заполняется в RTB
- Программно ячейка тока DGV возвращается к тому, что было до изменения
- 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
Значение изменяется в RTB, и нажимается клавиша ENTER. Значение становится текстом из значения ячейки DGV [0,0] при обновлении, которое будет изменено, чтобы стать обновленным значением ячейки [x, y].
То, что затем остается, это новое значение для этой ячейки с дополнительной строкой выше.
Я проследил события, и вот что в основном происходит:
Запуск приложения
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), я не получаю эту проблему.