7 Stimmen

RichTextBox.AutoWordSelection defekt?

Ich schreibe eine Windows-Formularanwendung in C# und ich erstelle eine RichTextBox (über Code, nicht den Designer). Ich setze die AutoWordSelection-Eigenschaft auf false, aber wenn ich etwas im Feld markiere, springt es immer noch an die Grenzen der Wörter plus ein Leerzeichen. Ist dies ein Fehler in .NET oder mache ich es falsch?

16voto

Roast Punkte 1685

Mit .NET 3.5 habe ich immer noch dieses Problem. Dieses Problem wurde 2005 an Microsoft gemeldet und als "Wont Fix" gekennzeichnet. Dies ist die letzte Nachricht, die ich zu diesem Problem finden kann.

Hier ist der MS Connect Fehlerbericht: http://connect.microsoft.com/VisualStudio/feedback/details/115441/richtextboxs-autowordselection-property-does-not-work-correctly#details

Hier ist ein neuerer Beitrag aus dem Jahr 2010 über eine andere Person, die das Problem bemerkt hat: http://sonicflare.net/2010/01/10/shipped-bug-feature/#more-192

----------UPDATE-------------

Ich habe es geschafft, indem ich ein zusätzliches AutoWordSelection = False in das Load-Ereignis des Formulars eingefügt habe.

   public Form1()
    {
        InitializeComponent();
        rich = new RichTextBox();
        rich.Size = new Size(150, 50);
        rich.Text = "Ignoring a bug for five years does not make it a undocumented feature.";
        rich.Location = new Point(20, 20);
        rich.AutoWordSelection = false;
        this.Controls.Add(rich);
    }

private void Form1_Load(object sender, EventArgs e)
{
    this.BeginInvoke(new EventHandler(delegate
    {
        rich.AutoWordSelection = false;
    }));
}

2voto

codingcoding Punkte 688

Gleiches Problem hier mit RichTextBox in TabControl. Es spielte keine Rolle, ob sie im Designer oder dynamisch erstellt wurde. Die Lösung war, wie Roast in dem Kommentar unter seiner Antwort vorschlug, eines der Tab-Ereignisse zu verwenden. Nach dem Setzen von AutoWordSelection a False Dort trat das Problem gelegentlich auf, wenn die Registerkarten gewechselt wurden. Das Problem wurde behoben, indem man es auf True und dann False im Tab-Ereignis.

Private Sub TabControl1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles TabControl1.SelectedIndexChanged
    RichTextBox1.AutoWordSelection = True
    RichTextBox1.AutoWordSelection = False
End Sub

0voto

Greg Punkte 1

Ich erstelle auch dynamisch Rich-Text-Boxen und hatte das gleiche Auswahlproblem. Es hat etwas gedauert, aber ich konnte es umgehen, indem ich im Wesentlichen meine eigene Auswahlroutine erstellt habe. Es gibt einige bemerkenswerte flackern, wenn meine Routine nicht einverstanden mit der Standardauswahl des Steuerelements, aber es ist nicht allzu schlimm.

Ich habe eine private Ganzzahl erstellt, die die Startposition der Auswahl festhält. Sie ist standardmäßig -1. Dann habe ich einen MouseDown-Event-Handler implementiert, um das Drücken der linken Maustaste zu verarbeiten. Er ermittelt die Zeichenposition am Mauszeiger und setzt die private Ganzzahl auf die aktuelle Zeichenposition, wenn sie sich nicht bereits innerhalb der aktuellen Auswahl befindet.

Der MouseMove-Eventhandler prüft dann, ob die linke Maustaste noch gedrückt ist und aktualisiert die Eigenschaften SelectionStart und SelectionLength des Steuerelements entsprechend der gespeicherten Startposition und der aktuellen Zeichenposition. Beachten Sie, dass die Startposition immer die linke Seite der Auswahl ist, so dass sie der Maus folgt, wenn Sie Text rückwärts auswählen.

Etwas komplizierter wird es, wenn Sie auch Drag-and-Drop und den Auswahlrand unterstützen wollen.

0voto

neverhome Punkte 1

Ich bin auch auf dieses Problem gestoßen, allerdings mit einem Editor mit Registerkarten und mehreren RTBs. In diesem Fall können Sie den Workaround implementieren, indem Sie die Einstellung AutoWordSelection Eigenschaft zu False in dem Codeblock, der die RichTextBox erstellt. Zum Beispiel so:

Private Sub CreateNewRTBObject(ByVal items() As String)
    Try
        For Each s As String In items
            If Not FilePaths.Contains(s) Then
                rtb = New myRTB(s)
                rtb.AutoWordSelection = False
            End If
        Next
        tabs.SetTabWidth()
    Catch ex As Exception
        MsgBox(ex.ToString, MsgBoxStyle.Exclamation, title)
    End Try
End Sub

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X