hallo zusammen,
ich habe eine klasse mytextbox diese ist von usercontrol abgeleitet. darin ist die paint und resize methode implementiert. die klasse zeichnet einen rahmen um das textfeld.
jetzt wollte ich von dieser klasse eine neue klasse ableiten myintegertextbox. dazu habe ich folgendes implementiert:
leider werden die events OnTextChanged, onClick in der klasse MyIntegerTextbox nicht ausgelößt. ich bin nicht so fit mit den events. deshalb würde ich mich freuen wenn ihr mir einen tipp geben könnt. was ich noch versucht hatte war, die events in der mytextbox anzugeben nur ich weiß nicht genau wie. ich kann mir nämlich vorstellen, dass deshalb die events in MyIntegerTextbox nicht ausgeführt wird weil die klasse usercontrol die nicht implementiert.
vielleicht kann mir jemand helden.
danke und grüße
ich habe eine klasse mytextbox diese ist von usercontrol abgeleitet. darin ist die paint und resize methode implementiert. die klasse zeichnet einen rahmen um das textfeld.
Code:
public class MyTextbox : UserControl { private TextBox textbox = new TextBox(); private Color _borderColor; [Browsable(true)] public override String Text { get { return this.textbox.Text; } set { this.textbox.Text = value; } } public override Color BackColor { get { return this.textbox.BackColor; } set { this.textbox.BackColor = value; } } public Color BorderColor { get { return this._borderColor; } set { this._borderColor = value; this.Refresh(); } } public MyTextbox() { this.Paint += new PaintEventHandler(this.OnPaint); this.Resize += new EventHandler(this.OnResize); this.Height = this.textbox.Height + 2; this.Width = this.textbox.Width + 2; this.BorderColor = System.Drawing.SystemColors.Window; this.Controls.Add(this.textbox); } protected void OnResize(object sender, EventArgs e) { this.textbox.Size = new Size(this.Width - 2, this.Height - 2); this.textbox.Location = new Point(1, 1); } protected void OnPaint(object sender, PaintEventArgs e) { ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, _borderColor, ButtonBorderStyle.Solid); } }
Code:
public class MyIntegerTextbox : MyTextbox { private String _allowedChars = "0123456789"; private String _lastValidText = ""; private int _lastValidSelectionStart = 0; private int _lastValidSelectionLength = 0; private bool _validating = false; public String AllowedChars { get { return _allowedChars; } set { _allowedChars = value; Text = Text; //Text von nun ungültigen Zeichen "bereinigen" } } public override String Text { get { return base.Text; } set { StringBuilder onlyValid = new StringBuilder(); if (value != null) { foreach (char ch in value) { if (_allowedChars.Contains(ch.ToString())) { onlyValid.Append(ch); } } } base.Text = onlyValid.ToString(); } } protected override void OnTextChanged(EventArgs e) { if (_validating) { return; } try { _validating = true; foreach (char ch in base.Text) { if (!_allowedChars.Contains(ch.ToString())) { base.Text = _lastValidText; SelectionStart = _lastValidSelectionStart; SelectionLength = _lastValidSelectionLength; return; } } _lastValidText = base.Text; _lastValidSelectionStart = SelectionStart; _lastValidSelectionLength = SelectionLength; base.OnTextChanged(e); } finally { _validating = false; } } protected override void OnClick(EventArgs e) { _lastValidSelectionStart = SelectionStart; _lastValidSelectionLength = SelectionLength; base.OnClick(e); } protected override void OnKeyDown(KeyEventArgs e) { if (base.Text == _lastValidText) { _lastValidSelectionStart = SelectionStart; _lastValidSelectionLength = SelectionLength; } base.OnKeyDown(e); } protected override void OnKeyUp(KeyEventArgs e) { if (base.Text == _lastValidText) { _lastValidSelectionStart = SelectionStart; _lastValidSelectionLength = SelectionLength; } base.OnKeyUp(e); } private void InitializeComponent() { this.SuspendLayout(); this.ResumeLayout(false); } }
vielleicht kann mir jemand helden.
danke und grüße
Comment