c # - richTextBox får 'ekstra linje' på dataGridView CurrentCellChanged Event

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har tre begivenheder, der fyrer her, hvilket gør det muligt for en bruger at se den fulde tekst af en celle i en datagridview, da de ændrer celler i realtid og kan redigere tekst i cellen eller richTextBox (hvis tekstfeltet er for stor).
Jeg bruger:
dataGridView1\_CellValueChanged\_Handler - For at opdatere SQL og opdatere DGV
dataGridView1\_CurrentCellChanged\_Handler - At ændre teksten i RTB
richTextBox2\_KeyDown\_Handler - For at opdatere SQL og opdatere DGV


Problemet er, at når du redigerer teksten i RTB, når tingene går i fuld cirkel, får jeg en ekstra linje før celleværdien fra DGV. Jeg har sporet dette og kan fortælle følgende forekommer:



  1. Indtast cellen for at ændre i DGV, RTB er opdateret med værdi

  2. Værdi ændres i RTB, og tryk derefter på ENTER for at begå ændring

  3. DGV CurrentCell [[0,0]] siden det er opdateret, og vi har et nyt DGV

  4. Denne værdi befolder sig i RTB

  5. Programmatisk vender DGV nuværende celle tilbage til hvad det var før ændringen

  6. RTB er ryddet og opdateret, som havde værdien [[0,0]] og i stedet for
    ny [[x, y]] værdi, den har et mellemrum foran den nye værdi.



Ikke sikker på hvordan du håndterer dette problem endnu, nogen hjælp eller forslag inviteret.


Eksempelkode nedenfor:





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];
    }
}





Udgangspunktet er DGV-celle aktiv, og tekst er i RTB


Indtast billedbeskrivelse her [6]


Værdien ændres i RTB, og ENTER-tasten trykkes. Værdi bliver tekst fra DGVs celle [[0,0]] værdi ved opdatering, som vil blive ændret til at blive den opdaterede celle [[x, y]] værdi.


Indtast billedbeskrivelse her [7]


Hvad der er tilbage, er den nye værdi for den celle med en ekstra linje ovenfor.


Indtast billedbeskrivelse her [8]





Jeg sporede begivenhederne, og det er grundlæggende hvad der sker:


Program Start


dataGridView1\_CellValueChanged\_Handler
dataGridView1\_CellValueChanged\_Handler
dataGridView1\_CellValueChanged\_Handler


Vælg Cell for at ændre


dataGridView1\_CellValueChanged\_Handler


Skift værdi af tekst i RTB, tryk ENTER


richTextBox2\_KeyDown\_Handler
dataGridView1\_CellValueChanged\_Handler
dataGridView1\_CellValueChanged\_Handler
dataGridView1\_CellValueChanged\_Handler





Når jeg redigerer cellen fra selve cellen (initiering af dataGridView1\_CellValueChanged\_Handler), får jeg ikke dette problem.

Bedste reference


Hvis du ikke vil indtaste nøglen for at oprette en ny linje, skal du annullere tastetrykket (e.Handled=true;//STOP HANDLINGEN)


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
    }
}