2013-07-19 12 views
7

Potrzebuję ograniczyć liczbę znaków do wklejenia w wieloliniowym polu tekstowym.Jak ograniczyć liczbę znaków do wklejenia w polu tekstowym?

Powiedzmy to mój łańcuch zostanie wklejony w polu tekstowym:

Dobry Panie i Panowie dobę!
Chcę tylko wiedzieć

Jeśli jest to możliwe, proszę o pomoc.

Zasadą jest maksymalne znaków w linii wynosi 10, maksymalna rzędu wynosi 2. Stosując regułę, wklejony tekst powinien być tylko tak:

Dobry dzień L
Właśnie wan

+0

Czy chcesz zezwolić użytkownikowi na używanie krótkich klawiszy 'Ctrl + V'? –

+0

tak, każda forma wklejania (CTRL + V, kliknięcie prawym przyciskiem myszy + wklej, SHIFT + INSERT) jest dozwolona. –

Odpowiedz

5

nie ma automatyczny co do Zrób to. Będziesz musiał obsługiwać zdarzenie TextChanged w polu tekstowym i ręcznie przeanalizować zmieniony tekst, aby ograniczyć go do wymaganego formatu.

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

Dzięki! To mi się udało. :) –

1

Można to osiągnąć w następujący sposób. Ustaw maximum length pola tekstowego jako 22

textBox1.MaxLength = 22; 

W przypadku zmiany tekstu wykonaj następujące czynności

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

to automatycznie wchodzi do następnej linii po 10 znaków

+0

Dziękuję za opinię, ale widzisz, już mam pewne ograniczenia dotyczące tej kwestii (gdy użytkownik próbuje wprowadzić normalnie, jak NIE wkleja). Mój problem polega teraz na tym, jak uchwycić wklej ... –

+0

@Nitesh - rozwiązanie nie działa w przypadku wklejania, ponieważ podczas wklejania długość tekstu przechodzi od 0 do rozmiaru wklejanego tekstu. Nigdy nie jest to dokładnie 10, więc dodanie nowej linii nigdy nie występuje. Nie działa również, gdy użytkownik wprowadza 2 znaki, trafienia enter, a następnie wpisuje 2 znaki i trafienia. – shf301

+0

ya .. Zauważyłem. Pozwól mi spróbować więcej – Nithesh

3

Można złapać wiadomość WM_PASTE (wysłane do TextBox) przetworzyć siebie:

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

Dziękuję za to, ale zmiana kontroli (lub pole tekstowe) będzie dla mnie bardzo uciążliwa ... –

+0

@JackFrost not really. Po prostu dodaj oddzielną klasę do swojego projektu. Możesz ponownie użyć tej klasy. To najczystsze rozwiązanie. –

+0

Usunąłem bardzo podobną odpowiedź. – Kamil

0

Dlaczego nie pracować na danych schowka, aby to osiągnąć. Poniżej jest mały przykład.

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); 

} 

Teraz wklej dane tam, gdzie chcesz, dane zostaną przycięte do maksymalnej długości dozwolonej przez Twój program.

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

Jak to pomaga lepiej niż inne rozwiązania, które już zostały podane? –

Powiązane problemy