Come già detto, il SelectionStart
La proprietà non è affidabile per ottenere la posizione effettiva di CARET in un TextBox con una selezione attiva. Ciò è dovuto al fatto che questa proprietà punta sempre all'inizio della selezione (indizio:il nome non mente) e a seconda di come si seleziona il testo con il mouse il cursore potrebbe essere posizionato sul lato SINISTRO o DESTRO della selezione .
Questo codice (testato con LinqPAD) mostra un'alternativa
public class WinApi
{
[DllImport("user32.dll")]
public static extern bool GetCaretPos(out System.Drawing.Point lpPoint);
}
TextBox t = new TextBox();
void Main()
{
Form f = new Form();
f.Controls.Add(t);
Button b = new Button();
b.Dock = DockStyle.Bottom;
b.Click += onClick;
f.Controls.Add(b);
f.ShowDialog();
}
// Define other methods and classes here
void onClick(object sender, EventArgs e)
{
Console.WriteLine("Start:" + t.SelectionStart + " len:" +t.SelectionLength);
Point p = new Point();
bool result = WinApi.GetCaretPos(out p);
Console.WriteLine(p);
int idx = t.GetCharIndexFromPosition(p);
Console.WriteLine(idx);
}
L'API GetCaretPos
restituisce il punto nelle coordinate del cliente dove si trova il CARET. Puoi restituire l'indice del carattere dopo la posizione utilizzando il metodo gestito GetCharIndexFromPosition
. Ovviamente devi aggiungere un riferimento e un using a System.Runtime.InteropServices
.
Non sono sicuro che ci sia qualche inconveniente in questa soluzione e attendo se qualcuno più esperto può dirci se c'è qualcosa che non va o non c'è.