views:

67

answers:

2

I have a simple text box in a WPF application.

I need to know when a character was added/deleted in the text box, which character and where it was added or deleted.

I thought to use the TextBox.KeyDown event, but it has some problems:

  • I can't know where the character was added or deleted.
  • I have no idea how to determite which character was added (from the KeyEventArgs).

Any ideas?

I don't care to use a completely different solution from what I thought. In addition, I've just started this project so I don't care to use Windows Forms instead of WPF if your solution requires it.

Thank you.

+2  A: 

You can use a "brute force" method - the text box (in winforms and I think in WPF as well) has a text changed event you can use and by comparing the text before the event and the current text you can find what character has been added or removed.

Dror Helper
Wouldn't be slooooooow? It can be two or three words but can be a complete document.
TTT
Each time only one character has changes - so it shouldn't be too slow - but there bound to be a better solution
Dror Helper
+1  A: 

Found the solution. In WPF, the TextBox.TextChanged event has a TextChangedEventArgs. In this class, there is a property named Changes.

Here's my code:

private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
    foreach (var change in e.Changes)
    {
        if (change.AddedLength > 0 && change.RemovedLength == 0)
        {
            if (change.AddedLength == 1)
            {
                AddCharacter(textBox1.Text[change.Offset], change.Offset);
            }
            else
            {
                AddString(textBox1.Text.Substring(change.Offset, change.AddedLength), change.Offset);  
            }
        }
        else if (change.AddedLength == 0 && change.RemovedLength > 0)
        {
            if (change.RemovedLength == 1)
            {
                RemoveCharacter(change.Offset);
            }
            else
            {
                RemoveString(change.Offset, change.RemovedLength + change.Offset);
            }
        }
        else if (change.AddedLength == 1 & change.RemovedLength == 1)
        {
            ReplaceCharacter(change.Offset, textBox1.Text[change.Offset]);
        }
        else
        {
            ReplaceString(change.Offset, change.Offset + change.RemovedLength, textBox1.Text.Substring(change.Offset, change.AddedLength));
        }
    }
}

Now I just need to wait two days to accept this answer. :)

Thanks anyway.

TTT