Laden...

[erledigt]Roter Rahmen um TextBox nach fehlgeschlagener Validierung

Erstellt von Nexus633 vor 8 Jahren Letzter Beitrag vor 8 Jahren 3.540 Views
N
Nexus633 Themenstarter:in
54 Beiträge seit 2015
vor 8 Jahren
[erledigt]Roter Rahmen um TextBox nach fehlgeschlagener Validierung

Hallo,
ich benötiege wieder einen Tipp von euch.

Ist es möglich einen roten Rahmen um eine Textbox zu setzten, sofern eine Validierung fehlgeschlagen ist ?

Ich habe mehrere ansätze über goolge gefunden. z.B.


        bool focus = false;
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            if (focus)
            {
                textBox1.BorderStyle = BorderStyle.None;
                Pen p = new Pen(Color.Red);
                Graphics g = e.Graphics;
                int variance = 3;
                g.DrawRectangle(p, new Rectangle(textBox1.Location.X - variance, textBox1.Location.Y - variance, textBox1.Width + variance, textBox1.Height +variance ));
            }
            else
            {
                textBox1.BorderStyle = BorderStyle.FixedSingle;
            }
        }

        private void textBox1_Enter(object sender, EventArgs e)
        {
            focus = true;
            this.Refresh();
        }

        private void textBox1_Leave(object sender, EventArgs e)
        {
            focus = false;
            this.Refresh();
        }

Leider bekomme ich das nicht hin.
Auch klassen die von Panel oder UserControl abgeleitet werden.

UserControl


public class BorderedTextBox : UserControl
{
    TextBox textBox;

    public BorderedTextBox()
    {
        textBox = new TextBox()
        {
            BorderStyle = BorderStyle.FixedSingle,
            Location = new Point(-1, -1),
            Anchor = AnchorStyles.Top | AnchorStyles.Bottom |
                     AnchorStyles.Left | AnchorStyles.Right
        };
        Control container = new ContainerControl()
        {
            Dock = DockStyle.Fill,
            Padding = new Padding(-1)
        };
        container.Controls.Add(textBox);
        this.Controls.Add(container);

        DefaultBorderColor = SystemColors.ControlDark;
        FocusedBorderColor = Color.Red;
        BackColor = DefaultBorderColor;
        Padding = new Padding(1);
        Size = textBox.Size;
    }

    public Color DefaultBorderColor { get; set; }
    public Color FocusedBorderColor { get; set; }

    public override string Text
    {
        get { return textBox.Text; }
        set { textBox.Text = value; }
    }

    protected override void OnEnter(EventArgs e)
    {
        BackColor = FocusedBorderColor;
        base.OnEnter(e);
    }

    protected override void OnLeave(EventArgs e)
    {
        BackColor = DefaultBorderColor;
        base.OnLeave(e);
    }

    protected override void SetBoundsCore(int x, int y,
        int width, int height, BoundsSpecified specified)
    {
        base.SetBoundsCore(x, y, width, textBox.PreferredHeight, specified);
    }
}

**Panel **


public class BorderTextBox : Panel {
  private Color _NormalBorderColor = Color.Gray;
  private Color _FocusBorderColor = Color.Blue;

  public TextBox EditBox;

  public BorderTextBox() {
    this.DoubleBuffered = true;
    this.Padding = new Padding(2);

    EditBox = new TextBox();
    EditBox.AutoSize = false;
    EditBox.BorderStyle = BorderStyle.None;
    EditBox.Dock = DockStyle.Fill;
    EditBox.Enter += new EventHandler(EditBox_Refresh);
    EditBox.Leave += new EventHandler(EditBox_Refresh);
    EditBox.Resize += new EventHandler(EditBox_Refresh);
    this.Controls.Add(EditBox);
  }

  private void EditBox_Refresh(object sender, EventArgs e) {
    this.Invalidate();
  }

  protected override void OnPaint(PaintEventArgs e) {
    e.Graphics.Clear(SystemColors.Window);
    using (Pen borderPen = new Pen(this.EditBox.Focused ? _FocusBorderColor : _NormalBorderColor)) {
      e.Graphics.DrawRectangle(borderPen, new Rectangle(0, 0, this.ClientSize.Width - 1, this.ClientSize.Height - 1));
    }
    base.OnPaint(e);
  }
}

Ein kleines Bespiel zur validierung


if (textBox1.Text != "TestValidierung")
{
      // jetzt soll der rote Rahmen erscheinen.
}

Wie funktioniert das genau ?
Kann mir da jemand weiterhelfen ?

Lieben Gruß

W
195 Beiträge seit 2008
vor 8 Jahren

Alle drei von Dir hier angegeben Varianten funktionieren. Was also genau bekommst Du nicht hin?

N
Nexus633 Themenstarter:in
54 Beiträge seit 2015
vor 8 Jahren

Hey,
Ok das jetzt Peinlich... In der Normalen Form funktioiert es.
Ich nutze derzeit das MaterialForm von MaterialSkin.Controls.

Kann das daran liegen das es von dem Framework nicht unterstützt wird ?
Gibt es auch noch andere wege um dies zu virsualisieren ?

Möchte ungerne das Style ändern 😃

Ich finde das sieht gut aus 😃

Lieben Gruß

W
195 Beiträge seit 2008
vor 8 Jahren

Schau Dir mal den Quellcode von MaterialSingleLineTextField an. Dort wird ähnlich wie in den von Dir im erstn Post angegeben Varianten eine Textbox in ein Control eingebettet. Dort könntest Du ansetzen um Dir ein eigenes Control abzuleiten und die entsprechenden Zeichenroutine zu überschreiben (OnPaint).

S
145 Beiträge seit 2013
vor 8 Jahren

Per NativeWindow an die WndProc der TextBox hängen.

bissel abgespeckte Version meines NativeWindow


        internal sealed class NativeTextPaint : NativeWindow, IDisposable
        {
            internal NativeTextPaint(TextBox textBox)
            {
                this.textBox = textBox;

                this.AssignHandle(textBox.Handle);
            }

            protected override void WndProc(ref Message m)
            {
                if (isDisposed)
                    base.WndProc(ref m);
                else
                {
                    switch (m.Msg)
                    {
                        case 15: // this is the WM_PAINT message
                            //textBox.Invalidate();
                            // call the default win32 Paint method for the TextBox first
                            base.WndProc(ref m);
                            // draw extra stuff over the TextBox
                            this.Paint();
                            break;
                        default:
                            base.WndProc(ref m);
                            break;
                    }
                }
            }

            private void Paint()
            {
                using (Graphics textBoxGraphics = Graphics.FromHwnd(textBox.Handle))
                {
                   // --- hier zeichnen ---
                }
            }


            public void Dispose()
            {
                if (!isDisposed)
                {
                    ReleaseHandle();

                    textBox = null;

                    GC.SuppressFinalize(this);

                    isDisposed = true;
                }
            }

            private TextBox textBox;
            private bool isDisposed;
        }
N
Nexus633 Themenstarter:in
54 Beiträge seit 2015
vor 8 Jahren

Hey,
danke für eure ansätze

@wcseller
ich habe mir die Klasse angeschaut und eine weitere Eigenschaft hinzugefügt die bei True den Rahmen Rot setzt und die Animation auch.

Funktioniert Tadellos.

Danke dir für den Hinweis.