problem mit usercontrol

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    problem mit usercontrol

    Hey comm,
    ich hab ein control und darauf eine Textbox und eine Richtextbox.
    ich moechte das ganze als code editor machen, also soll man nur in die richtextbox eingeben koennen, die textbox zeigt die zeilennummer.
    deshalb hab ich bei der textbox readonly auf true gesetzt. aber auf einmal kann ich auch nix mehr in die rtb eingeben, obwohl readonly da noch auf false ist... wenn ich bei der tb readonly wieder auf false stelle, kommt alles was ich geschrieben hab ploetzlich in der tb, obwohl ich die rtb angeklickt hab. da kommen statddessen nur leerzeichen... ;(
    was mach ich falsch??????

    VB.NET-Quellcode

    1. Public Class codebox
    2. Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.TextChanged
    3. For i As Integer = 0 To RichTextBox1.Lines.Count - 1
    4. TextBox1.Text = TextBox1.Text & i & vbCrLf
    5. Next
    6. End Sub
    7. End Class
    :| wie gesagt ich hab ne tb als zeilennumerierung und ne rtb als eigentlichen text. wenn ich aber was in die rtb eingeben will kommt der text in der tb. wenn ich bei der readonly auf true stelle kann ich garnix mehr machen...
    Edit: vielleicht sollte ich die nummerierung weglassen... wobei ich da irgendwie zu bloed bin von rtb zu erben... :pinch:
    Ich habe dir mal einen Codeschnipsel geschrieben, der das Ganze veranschaulicht. Das Beispielprojekt ist als Datei angehängt.

    VB.NET-Quellcode

    1. Imports System.Text
    2. Public Class Form1
    3. Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.TextChanged
    4. TextBox1.Text = ForEach(RichTextBox1.Lines.Length)
    5. End Sub
    6. Private Function ForEach(ByVal val As Int32) As String
    7. Dim sb As New StringBuilder
    8. 'Für jede enthaltene Zeile die Zeilennummer und ein vbCrLf anfügen
    9. For x As Int32 = 1 To val
    10. sb.AppendFormat("{0}{1}", x, vbCrLf)
    11. Next
    12. Return sb.ToString()
    13. End Function
    14. End Class
    Dateien
    Gruß
    hal2000

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hal2000“ ()

    danke, aber ich hab immer noch das selbe problem...

    Lade dir das Beispielprojekt herunter und starte es. Schau dir an, was dort alles (nicht ~ ) eingestellt ist. Wenn du in deinem Projekt irgendwelche Optionen verstellt hast, kann das Ganze nicht funktionieren. Dafür kann ich aber nicht garantieren - Nach der Kopieren-Einfügen-Aktion des (vollständig lauffähigen) Codes bist du nunmal auf dich allein gestellt, weil ich nicht in deinen Rechner schauen kann. Zumindest von hier aus nicht.
    Gruß
    hal2000

    jansteffen schrieb:

    oder es hat was damit zu tun, dass ich ein usercontrol verwende und du ne form

    Stimmt - mit einem UserControl wird dieser Code nicht funktionieren. Warum verwendest du ein UserControl und keine Form?

    Edit: Um deinen anderen Thread ([VB 2008] seltsames problem mit inherits) aufzugreifen (der offensichtlich dieselbe Thematik aufgreift): Mit dem Ableiten von RichTextBox kommst du nicht weiter, da du an die Box eine TextBox anfügen müsstest, was zu kompliziert ist. Mit dem UserControl (mit Text- UND RichTextBox) liegst du schon goldrichtig, wenn du unbedingt ein Usercontrol statt einer Form verwenden möchtest. Ich habe das hier angestrebte UserControl bereits geschrieben - es funktioniert tatsächlich (mit ein paar Modifikationen). Hier die vorläufige Version:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Text
    2. Imports System.ComponentModel
    3. <DefaultEvent("TextChanged")> _
    4. Public Class CodeEditor
    5. Protected WithEvents rtbCode As New RichTextBox
    6. Protected WithEvents txtLines As New TextBox
    7. Dim x, lnCount As Int32
    8. Dim g As Graphics
    9. Dim sz As SizeF
    10. <Browsable(True), EditorBrowsable(EditorBrowsableState.Always)> _
    11. <DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)> _
    12. Public Overrides Property Text() As String
    13. Get
    14. Return Me.rtbCode.Text
    15. End Get
    16. Set(ByVal value As String)
    17. Me.rtbCode.Text = value
    18. End Set
    19. End Property
    20. Private Sub rtbCode_FontChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles rtbCode.FontChanged
    21. txtLines.Font = rtbCode.Font
    22. Me.CodeEditor_Resize(sender, e)
    23. End Sub
    24. Private Sub rtbCode_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles rtbCode.TextChanged
    25. Me.CodeEditor_Resize(sender, e)
    26. With rtbCode.Lines
    27. If lnCount < .Length Then
    28. txtLines.Text = ForEach(.Length - lnCount + 1, .Length)
    29. Else
    30. txtLines.Text = ForEach(1, .Length)
    31. End If
    32. End With
    33. MyBase.OnTextChanged(e)
    34. End Sub
    35. Private Function ForEach(ByVal start As Int32, ByVal max As Int32) As String
    36. Dim sb As New StringBuilder
    37. 'Für jede enthaltene Zeile die Zeilennummer und ein vbCrLf anfügen
    38. For i As Int32 = start To max
    39. sb.AppendFormat("{0}{1}", i, vbCrLf)
    40. Next
    41. Return sb.ToString()
    42. End Function
    43. Private Sub CodeEditor_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    44. With txtLines
    45. .ReadOnly = True
    46. .Dock = DockStyle.Left
    47. .Multiline = True
    48. End With
    49. rtbCode.Dock = DockStyle.Right
    50. With Me
    51. .Controls.Add(txtLines)
    52. .Controls.Add(rtbCode)
    53. End With
    54. End Sub
    55. Private Sub txtLines_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtLines.GotFocus
    56. 'Die TextBox darf nie den Fokus erhalten - sie ist nur für die Anzeige zuständig.
    57. Me.ProcessTabKey(True)
    58. End Sub
    59. Private Sub CodeEditor_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
    60. g = rtbCode.CreateGraphics()
    61. sz = g.MeasureString(rtbCode.Lines.Length.ToString(), txtLines.Font)
    62. lnCount = CInt(Me.Height / sz.Height)
    63. x = CInt(sz.Width) + 3
    64. rtbCode.Bounds = New Rectangle(x, 0, Me.Width - x, Me.Height)
    65. txtLines.Bounds = New Rectangle(0, 0, x, Me.Height)
    66. End Sub
    67. End Class

    Gruß
    hal2000

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „hal2000“ ()

    ich glaub ich nehm einfach fireball, auch wenn ich den iwie nich so mag... gucks mir vielleicht spaeter an, aber auf jedenfall danke :)
    P.S.:Nein, ich hab kein problem mit fireball, ich hab ihn schon in mein projekt eingebunden und alles funzt super!
    Edit:hmm, bei deinem code krieg ich n haufen fehler... welche vb version hast du da benutzt?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „jansteffen“ ()