Eigene Textbox - Keydown

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Eigene Textbox - Keydown

    Hey,und zwar habe ich eine eigene Textbox geschrieben, nur leider funktioniert dasKeyDown Event irgendwie nicht. KeyPreview ist bei der WinForm auf True gestellt.Das KeyDown Event frage ich so ab:

    VB.NET-Quellcode

    1. Private Sub MangoETextBox2_TextChanged(sender As Object, e As EventArgs) Handles MangoETextBox2.TextChanged
    2. ...
    3. End Sub
    Kann mir da jemand was zu sagen?Code von der Textbox:

    C#-Quellcode

    1. [DefaultEvent("TextChanged")]public class MangoETextBox : Control
    2. {
    3. private TextBox tB = new TextBox();
    4. #region "Control Help - Properties & Flicker Control"
    5. private bool _passmask = false;
    6. public bool UseSystemPasswordChar
    7. {
    8. get {return _passmask;}
    9. set
    10. {
    11. if (value.Equals(_passmask)) return;
    12. tB.UseSystemPasswordChar = UseSystemPasswordChar;
    13. _passmask = value;
    14. this.Invalidate();
    15. }
    16. }
    17. private int _maxchars = 32767;
    18. public int MaxLength
    19. {
    20. get {return _maxchars;}
    21. set
    22. {
    23. if (value == _maxchars) return;
    24. _maxchars = value;
    25. tB.MaxLength = MaxLength;
    26. this.Invalidate();
    27. }
    28. }
    29. private HorizontalAlignment _align;
    30. public HorizontalAlignment TextAlignment
    31. {
    32. get {return _align;}
    33. set
    34. {
    35. if (value.Equals(_align)) return;
    36. _align = value;
    37. this.Invalidate();
    38. }
    39. }
    40. protected override void OnPaintBackground(System.Windows.Forms.PaintEventArgs pevent) {}
    41. protected override void OnTextChanged(System.EventArgs e)
    42. {
    43. base.OnTextChanged(e);
    44. tB.Text = Text;
    45. this.Invalidate();
    46. }
    47. protected override void OnBackColorChanged(System.EventArgs e)
    48. {
    49. base.OnBackColorChanged(e);
    50. tB.BackColor = Color.White;
    51. this.Invalidate();
    52. }
    53. protected override void OnForeColorChanged(System.EventArgs e)
    54. {
    55. base.OnForeColorChanged(e);
    56. tB.ForeColor = ForeColor;
    57. this.Invalidate();
    58. }
    59. protected override void OnFontChanged(System.EventArgs e)
    60. {
    61. base.OnFontChanged(e);
    62. tB.Font = Font;
    63. }
    64. protected override void OnGotFocus(System.EventArgs e)
    65. {
    66. base.OnGotFocus(e);
    67. tB.Focus();
    68. }
    69. protected override void OnKeyDown(KeyEventArgs e)
    70. {
    71. base.OnKeyDown(e);
    72. }
    73. public void TextBox_TextChanged(object sender, EventArgs e) { this.Text = tB.Text; }
    74. public void NewTextBox()
    75. {
    76. var _with1 = tB;
    77. _with1.Multiline = false;
    78. _with1.ForeColor = ForeColor;
    79. _with1.BackColor = Color.White;
    80. _with1.Text = String.Empty;
    81. _with1.TextAlign = HorizontalAlignment.Center;
    82. _with1.BorderStyle = BorderStyle.None;
    83. _with1.Location = new Point(5, 4);
    84. _with1.Font = new Font("Trebuchet MS", 8.25f, FontStyle.Bold);
    85. _with1.Size = new Size(Width - 10, Height - 11);
    86. _with1.UseSystemPasswordChar = UseSystemPasswordChar;
    87. _with1.TextChanged += new System.EventHandler(this.TextBox_TextChanged);
    88. this.Controls.Add(_with1);
    89. }
    90. #endregion
    91. public MangoETextBox() : base()
    92. {
    93. this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor | ControlStyles.FixedHeight, true);
    94. this.UpdateStyles();
    95. this.BackColor = Color.White;
    96. this.ForeColor = Color.FromArgb(102, 102, 102);
    97. this.Size = new Size(135, 35);
    98. NewTextBox();
    99. Text = string.Empty;
    100. }
    101. protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
    102. {
    103. Graphics G = e.Graphics;
    104. Rectangle ClientRectangle = new Rectangle(0, 0, Width - 1, Height - 1);
    105. Height = tB.Height + 11;
    106. Font drawFont = new Font("Tahoma", 9, FontStyle.Regular);
    107. var _with2 = tB;
    108. _with2.Width = Width - 12;
    109. _with2.ForeColor = Color.FromArgb(102, 102, 102);
    110. _with2.Font = drawFont;
    111. _with2.TextAlign = TextAlignment;
    112. _with2.UseSystemPasswordChar = UseSystemPasswordChar;
    113. G.Clear(BackColor);
    114. G.SmoothingMode = SmoothingMode.HighQuality;
    115. G.CompositingQuality = CompositingQuality.HighQuality;
    116. G.FillRectangle(new SolidBrush(Color.White), ClientRectangle);
    117. G.DrawPath(new Pen(Color.FromArgb(0, 191, 255)), Draw.RoundRectF(new Rectangle(1, 1, Width - 3, Height - 3), 1));
    118. G.DrawPath(new Pen(Color.FromArgb(0, 191, 255)), Draw.RoundRectF(new Rectangle(1, 1, Width - 3, Height - 3), 2));
    119. G.DrawPath(new Pen(Color.FromArgb(16, 78, 139)), Draw.RoundRectF(new Rectangle(0, 0, Width - 1, Height - 1), 2));
    120. G.DrawPath(new Pen(Color.FromArgb(16, 78, 139)), Draw.RoundRectF(new Rectangle(0, 0, Width - 1, Height - 1), 3));
    121. }
    122. protected override void Dispose(bool disposing)
    123. {
    124. if (disposing)
    125. {
    126. // Objekte disposen
    127. }
    128. base.Dispose(disposing);
    129. }
    130. }

    Daniel Baumert schrieb:

    Handles MangoETextBox2.TextChanged
    Ist nicht das KeyDown-Event! TextChanged tritt ein, wenn der Text geändert wird. Dies kann auch einfach durch ändern des Textes via Quellcode eintreten. KeyDown ist wirklich KeyDown und nicht TextChanged. Daher wirds auch wohl nicht laufen.

    LG :)
    Ne kann ich nirgends lesen. Ich würde dir aber empfehlen, dass du von einer TextBox anstatt von Control erbst. Derzeit erstellst du eine unsichtbare TextBox. Das ist einfach nur Mist, da kannst du -wie gesagt- direkt von der TextBox erben. Du kannst die immer noch selbst zeichnen, aber hast kein Problem mit der Eingabe. Das hat dir MS schon abgenommen.
    Jou.

    Daniel Baumert schrieb:

    Wird nicht ausgelöst
    TextChanged wird ausgelöst, weil es da eine Methode für gibt:

    Daniel Baumert schrieb:

    C#-Quellcode

    1. _with1.TextChanged += new System.EventHandler(this.TextBox_TextChanged);

    Für KeyDown gibt es keine Methode.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Daniel Baumert schrieb:

    hinzufügen
    Wie lange brauchst Du, das "experimentell" herauszubekommen? ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Daniel Baumert schrieb:

    hinzufügen
    Wie lange brauchst Du, das "experimentell" herauszubekommen? ;)


    This does definitely not work.

    C#-Quellcode

    1. public void NewTextBox()
    2. {
    3. var _with1 = tB;
    4. _with1.Multiline = false;
    5. _with1.ForeColor = ForeColor;
    6. _with1.BackColor = Color.White;
    7. _with1.Text = String.Empty;
    8. _with1.TextAlign = HorizontalAlignment.Center;
    9. _with1.BorderStyle = BorderStyle.None;
    10. _with1.Location = new Point(5, 7);
    11. _with1.Font = new Font("Trebuchet MS", 8.25f, FontStyle.Bold);
    12. _with1.Size = new Size(Width - 10, Height - 11);
    13. _with1.UseSystemPasswordChar = UseSystemPasswordChar;
    14. _with1.TextChanged += new System.EventHandler(this.TextBox_TextChanged);
    15. _with1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBox_TextChanged);
    16. this.Controls.Add(_with1);
    17. }


    VB.NET-Quellcode

    1. Private Sub MangoETextBox4_KeyDown(sender As Object, e As KeyEventArgs) Handles MangoETextBox4.KeyDown
    2. MessageBox.Show(e.KeyCode.ToString)
    3. End Sub

    Daniel Baumert schrieb:

    This does definitely not work.
    Workes it denn nun oder ja, sofern Du dun die korrekten Handler implementiert hast:

    VB.NET-Quellcode

    1. Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    2. End Sub
    3. Private Sub TextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles TextBox1.KeyDown
    4. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Daniel Baumert schrieb:

    definitiv nicht
    Klar, bei dem Code ...
    (Poste mal den aktuellen Stand).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Naja du musst das Event noch durchreichen:

    C#-Quellcode

    1. public void NewTextBox() {
    2. ..
    3. _with1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBox_KeyDown);
    4. ..
    5. }
    6. public void TextBox_KeyDown(object sender, KeyEventArgs e)
    7. {
    8. this.OnKeyDown(e);
    9. }
    Das ist meine Signatur und sie wird wunderbar sein!

    Daniel Baumert schrieb:

    Funktioniert das so auch nicht.
    Aber so:

    C#-Quellcode

    1. public delegate void KeyDownEventHandler(object sender, KeyEventArgs e);
    2. public new KeyDownEventHandler KeyDown;
    3. // ...
    4. _with1.KeyDown += _with1_KeyDown;
    5. // ...
    6. void _with1_KeyDown(object sender, KeyEventArgs e)
    7. {
    8. if (this.KeyDown != null)
    9. {
    10. this.KeyDown(sender, e);
    11. }
    12. }

    C#-Quellcode

    1. this.mangoETextBox1.KeyDown += this.mangoETextBox1_KeyDown;
    2. // ...
    3. private void mangoETextBox1_KeyDown(object sender, KeyEventArgs e)
    4. {
    5. label2.Text = e.KeyCode.ToString();
    6. }

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!