2013-07-19 13 views
7

Devo limitare il numero di caratteri da incollare in una casella di testo multilinea.Come limitare il numero di caratteri da incollare nella casella di testo?

Diciamo che questa è la mia stringa per essere incollato nella casella di testo:

Buone giorno delle donne e signori!
Voglio solo sapere

Se questo è possibile, si prega di aiuto.

La regola è numero massimo di caratteri per riga è 10, numero massimo di righe è 2. applicando la regola, testo incollato dovrebbe essere solo in questo modo:

Buon giorno L
Ho appena wan

+0

si desidera consentire all'utente di utilizzare i tasti di scelta rapida 'Ctrl + V'? –

+0

sì, qualsiasi forma di incolla (CTRL + V, tasto destro + incolla, MAIUSC + INSERISCI) è consentita. –

risposta

5

Non è automatico che cosa Fai questo. È necessario gestire l'evento TextChanged nella casella di testo e analizzare manualmente il testo modificato per limitarlo al formato richiesto.

private const int MaxCharsPerRow = 10; 
private const int MaxLines = 2; 

private void textBox1_TextChanged(object sender, EventArgs e) { 
    string[] lines = textBox1.Lines; 
    var newLines = new List<string>(); 
    for (int i = 0; i < lines.Length && i < MaxLines; i++) { 
     newLines.Add(lines[i].Substring(0, Math.Min(lines[i].Length, MaxCharsPerRow))); 
    } 
    textBox1.Lines = newLines.ToArray(); 
} 
+0

Grazie! Questo ha reso il trucco per me. :) –

1

È possibile ottenere questo nel modo seguente. Impostare maximum length della casella di testo come 22

textBox1.MaxLength = 22; 

Nel caso in cambio di testo eseguire le seguenti operazioni

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    if (textBox1.Text.Length == 10) 
    { 
      textBox1.AppendText("\r\n"); 
    } 
} 

Questo vi entra automaticamente alla riga successiva dopo 10 caratteri

+0

Grazie per il tuo feedback, ma vedi, ho già una restrizione in merito (quando l'utente sta tentando di inserire normalmente come NON incollare). Il mio problema ora è come catturare l'incolla ... –

+0

@Nitesh - la soluzione non funziona nel caso di incollatura perché quando si incolla la lunghezza del testo va da 0 immediatamente alla dimensione del testo incollato. Non è mai esattamente 10 quindi l'aggiunta della nuova linea non avviene mai. Né funziona se l'utente digita 2 caratteri, i colpi entrano, quindi digita 2 caratteri e i colpi entrano. – shf301

+0

ya .. Ho notato. Fammi provare di più – Nithesh

3

È possibile prendere il messaggio WM_PASTE (inviato al tuo TextBox) per elaborare da soli:

public class MyTextBox : TextBox 
{ 
    int maxLine = 2; 
    int maxChars = 10; 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x302)//WM_PASTE 
     { 
      string s = Clipboard.GetText(); 
      string[] lines = s.Split('\n'); 
      s = ""; 
      int i = 0; 
      foreach (string line in lines) 
      { 
       s += (line.Length > maxChars ? line.Substring(0, maxChars) : line) + "\r\n"; 
       if (++i == maxLine) break; 
      } 
      if(i > 0) SelectedText = s.Substring(0,s.Length - 2);//strip off the last \r\n 
      return; 
     } 
     base.WndProc(ref m);    
    } 
} 
+0

Grazie per questo, ma cambiare il controllo (o la casella di testo) sarà molto doloroso per me ... –

+0

@JackFrost non proprio. Basta aggiungere una classe separata nel tuo progetto. Puoi riutilizzare questo corso. Questa è la soluzione più pulita. –

+0

Ho rimosso la mia risposta molto simile. – Kamil

0

Perché non si lavora sui dati degli Appunti per raggiungere questo obiettivo. Di seguito è un piccolo esempio.

String clipboardText = Clipbard.GetText(); 

// MAXPASTELENGTH - max length allowed by your program 

if(clipboardText.Length > MAXPASTELENGTH) 
{ 

    Clipboard.Clear(); 

    String newClipboardText = clipboardText.Substring(0, MAXPASTELENGTH); 

    // set the new clipboard data to the max length 
    SetData(DataFormats.Text, (Object)newClipboardText); 

} 

Ora incollare i dati dovunque vi piace, i dati devono essere tagliati alla lunghezza massima consentita dal programma.

-2
private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     if (textBox1.Text.Length == 10) 
     { 
      textBox1.MaxLength = 10; 
      //MessageBox.Show("maksimal 10 karakter"); 
     } 
    } 
+3

In che modo questo aiuta meglio delle altre soluzioni già fornite? –

Problemi correlati