Frage

habe ich ein Windows Form mit einem RichTextBox darauf. Der Inhalt der RichTextBox ist mit einem Datenbank-Feld geschrieben, die auf 64k Daten sind begrenzt. Für meine Zwecke, das ist viel mehr als genug Text zu speichern.

Ich habe die MaxLength-Eigenschaft zu vermeiden, mehr Daten insertng als erlaubt.

rtcControl.MaxLength = 65536

Howevery, die nur die Menge von Zeichen beschränkt, die so erlaubt ist, in dem Text zu setzen. Aber mit der Formatierung über Kopf aus der Rtf Ich kann mehr Text eingeben, als ich es erlaubt sein soll. Es kommt auch die noch schlimmer, wenn ich Einsatz ein großes Bild, das die TextLength überhaupt erhöhen dosn't aber die Rtf Länge wächst ziemlich viel.

Im Moment prüfe ich die Länge der Rtf-Eigenschaft richttextboxes im Formclosing Ereignisse und eine Nachricht an den Benutzer anzuzeigen, wenn es zu groß ist. Doch das ist nur eine Abhilfe, weil ich mehr Daten nicht zulassen will, als in die Steuerung erlaubt setzen (wie in einem Textfeld, wenn Sie die MaxLength-Eigenschaft nichts überschreiten wird in die Steuer eingefügt und Sie hören den Standard-Piepton ().

Alle Ideen, wie dies achive?

ich schon versucht:

  • mit einem benutzerdefinierten Steuerelement, das die richtextbox und Schatten th Rtf Eigenschaft zum Abfangen des Einschiebens erstreckt. Aber es scheint, es wird nicht ausgeführt, wenn ich Text hinzufügen.

  • Auch das Textchanged Ereignis nicht ausgelöst, wenn ich smth geben. in der Kontrolle.

War es hilfreich?

Lösung

Was dies zu tun:

Gehen Sie mit dem Textchanged-Ereignis und vergleichen jedes Mal ändert. Es abgefeuert für die Texteingabe und Bild per Drag und Tropfen.

private void richTextBox1_TextChanged(object sender, EventArgs e)
{
   if (richTextBox1.Rtf.Length > richTextBox1.MaxLength)
   {
      // do something here - I displayed a label for
      // my example 
      label1.Text = "Text exceeds maximum size";
      label1.ForeColor = Color.Red;
   }
   else
   {
      label1.Text = richTextBox1.Rtf.Length.ToString();
      label1.ForeColor = Color.Red;
   }
}

Das schien Arbeit, obwohl ich nicht viel Zeit auf dieser, zugegebenermaßen verbracht haben. Ich vermute, Sie könnten den Inhalt gestutzt, wenn sie die maximale Größe überschreitet.


Edit: Ich dachte darüber einig mehr, und ich vermute, dass Sie einen Stringbuilder verwenden könnten den Inhalt der richtextbox jedes Mal speichern aus, und wenn man diese Länge zu überschreiten versucht, zur Wiederherstellung der Daten auf dem vorheriger Status. Ich gebe zu, das ein bisschen hacky, aber es scheint zu funktionieren. So etwas wie folgt aus:

StringBuild sb = new StringBuilder();

private void richTextBox1_TextChanged(object sender, EventArgs e)
{
   if (richTextBox1.Rtf.Length > richTextBox1.MaxLength)
   {
      richTextBox1.Rtf = sb.ToString();
   }
   else
   {
      sb.Insert(0,richTextBox1.Rtf);
   }
}

Das scheint zu funktionieren recht gut. Es könnte eine elegantere Lösung.

Andere Tipps

In Antwort auf itsmatt:

Das funktioniert, mit Ausnahme des Textchanged Ereignis, das in meiner Umgebung nicht zu Feuer scheint (weiß nicht warum). Aber da ich meine eigene Usercontrol haben, die von RichTextBox ich interited ist konnte die OnTextChanged () -Methode außer Kraft zu setzen, die aufgerufen wird. Aber der Code get ist ein wenig komplizierter, denn wenn man den Text in der Methode OnTextChanged ändern () wieder zu einem Stackoverflow was dazu führt, aufgerufen wird. Ich wollte auch einen Signalton () und die Cursor-Position / Auswahl sollte nicht vergessen werden.

Mit diesem Code es ist erhalten irgendwie langsam mit Text> 30000, aber das ist gut genug für mich. Die Benutzer sollten nicht speichern, so viele Daten in ihm trotzdem.

    private string lastText;
    private string lastRtf;
    private int lastSelectionStart;
    private int lastSelectionLength;

    private bool skipLengthCheck;
    protected override void OnTextChanged(EventArgs e)
    {
        if (Rtf.Length > MaxLength && !skipLengthCheck)
        {
            skipLengthCheck = true;
            Console.WriteLine("MaxLength exceeded");
            System.Media.SystemSounds.Beep.Play();
            int start = lastSelectionStart;
            int length = lastSelectionLength;
            base.Text = lastText;
            base.Rtf = lastRtf;
            SelectionStart = start > 0 ? start - 1 : 0;
            SelectionLength = length;
            skipLengthCheck = false;               
        }
        else
        {
            lastText = Text;
            lastRtf = Rtf;

            base.OnTextChanged(e);
        }

    }

    protected override void OnSelectionChanged(EventArgs e)
    {
        lastSelectionStart = SelectionStart;
        lastSelectionLength = SelectionLength;

        base.OnSelectionChanged(e);
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top