it-swarm.com.de

Ändern Sie die borderColor der TextBox

Wie kann ich die BorderColor der Textbox ändern, wenn ein Benutzer darauf klickt oder darauf fokussiert

20
Raggy Shrestha

versuche dies

        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();
        }
14
PraveenVenu

Sie können mit WM_NCPAINT message von TextBox umgehen und einen Rand im Nicht-Client-Bereich des Steuerelements zeichnen, wenn das Steuerelement den Fokus hat. Sie können jede Farbe verwenden, um den Rand zu zeichnen:

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class ExTextBox : TextBox
{
    [DllImport("user32")]
    private static extern IntPtr GetWindowDC(IntPtr hwnd);
    private const int WM_NCPAINT = 0x85;
    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        if (m.Msg == WM_NCPAINT && this.Focused)
        {
            var dc = GetWindowDC(Handle);
            using (Graphics g = Graphics.FromHdc(dc))
            {
                g.DrawRectangle(Pens.Red, 0, 0, Width - 1, Height - 1);
            }
        }
    }
}

Ergebnis

Das Bemalen von Rändern bei fokussierter Kontrolle ist völlig flimmerfrei:

 Change TextBox border color on focus

Hinweis

In dem aktuellen Beitrag ändere ich einfach die Rahmenfarbe. Sie können dem Steuerelement auch eine BorderColor -Eigenschaft hinzufügen. Sie können dann die Randfarbe je nach Anforderung zur Entwurfs- oder Laufzeit ändern. Here Ich habe eine vollständigere Version von TextBox veröffentlicht, die die BorderColor-Eigenschaft hat:

 Change Textbox border color

23
Reza Aghaei

Dies ist eine ultimative Lösung zum Festlegen der Rahmenfarbe einer TextBox:

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);
    }
}
9
Balazs Tihanyi

WinForms war nie gut darin und es ist ein bisschen schmerzhaft.

Sie können dies versuchen, indem Sie eine TextBox in ein Panel einbetten und die Zeichnung dann basierend auf dem Fokus verwalten:

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);
  }
}
5
LarsTech

setzen Sie das Textfeld Rahmenstil auf Keine Schreiben Sie dann diesen Code in das Containerformereignis "Paint"

private void Form1_Paint(object sender, PaintEventArgs e)
        {
System.Drawing.Rectangle rect = new Rectangle(TextBox1.Location.X, TextBox1.Location.Y, TextBox1.ClientSize.Width, TextBox1.ClientSize.Height);

                rect.Inflate(1, 1); // border thickness
                System.Windows.Forms.ControlPaint.DrawBorder(e.Graphics, rect, Color.DeepSkyBlue, ButtonBorderStyle.Solid);

}
0
Moory Pc

Die Verwendung von OnPaint zum Erstellen eines benutzerdefinierten Rahmens in Ihren Steuerelementen ist in Ordnung. Aber wissen Sie, wie Sie mit OnPaint die Effizienz aufrechterhalten und die Zeit auf ein Minimum reduzieren. Lesen Sie dies, wenn Sie mit benutzerdefinierten Paint-Routinen eine verzögerte grafische Benutzeroberfläche haben: Wie kann ich OnPaint in .Net-Anwendungen richtig einsetzen?

Denn die akzeptierte Antwort von PraVn mag einfach erscheinen, ist aber ineffizient. Die Verwendung eines benutzerdefinierten Steuerelements, wie es in den Antworten oben angegeben ist, ist viel besser. 

Vielleicht ist die Leistung in Ihrer Anwendung kein Problem, weil sie klein ist, aber für größere Anwendungen mit vielen benutzerdefinierten OnPaint-Routinen ist es ein falscher Ansatz, die von PraVn gezeigte Methode zu verwenden.

0
Mike de Klerk