Ich versuche, ein benutzerdefiniertes Steuerelement zu erstellen, das NumericUpDown
erbt, um eine einstellbare Einheit anzuzeigen.NumerischUpDown mit Einheit | Benutzerdefiniertes Steuerelement | Feldauffüllung
Mein Code::
Dies wird (visuell), was ich so weit gekommenein bisschen zu lang aussieht, aber isnt tun, dass viel
class NumericUpDownUnit : NumericUpDown
{
public event EventHandler ValueChanged;
/// <summary>
/// Constructor creates a label
/// </summary>
public NumericUpDownUnit()
{
this.TextChanged += new EventHandler(TextChanged_Base);
this.Maximum = 100000000000000000;
this.DecimalPlaces = 5;
this.Controls.Add(lblUnit);
lblUnit.BringToFront();
UpdateUnit();
}
public void TextChanged_Base(object sender, EventArgs e)
{
if(ValueChanged != null)
{
this.ValueChanged(sender, e);
}
}
/// <summary>
/// My designer property
/// </summary>
private Label lblUnit = new Label();
[Description("The text to show as the unit.")]
public string Unit
{
get
{
return this.lblUnit.Text;
}
set
{
this.lblUnit.Text = value;
UpdateUnit();
}
}
/// <summary>
/// When unit has changed, calculate new label-size
/// </summary>
public void UpdateUnit()
{
System.Drawing.Size size = TextRenderer.MeasureText(lblUnit.Text, lblUnit.Font);
lblUnit.Padding = new Padding(0, 0, 0, 3);
lblUnit.Size = new System.Drawing.Size(size.Width, this.Height);
lblUnit.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
lblUnit.BackColor = System.Drawing.Color.Transparent;
lblUnit.Location = new System.Drawing.Point(this.Width-lblUnit.Width-17, 0);
}
/// <summary>
/// If text ends with seperator, skip updating text as it would parse without decimal palces
/// </summary>
protected override void UpdateEditText()
{
if (!this.Text.EndsWith(".") && !this.Text.EndsWith(","))
Text = Value.ToString("0." + new string('#', DecimalPlaces));
}
/// <summary>
/// Culture fix
/// </summary>
protected override void OnKeyPress(KeyPressEventArgs e)
{
if (e.KeyChar.Equals('.') || e.KeyChar.Equals(','))
{
e.KeyChar = System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator.ToCharArray()[0];
}
base.OnKeyPress(e);
}
/// <summary>
/// When size changes, call UpdateUnit() to recalculate the lable-size
/// </summary>
protected override void OnResize(EventArgs e)
{
UpdateUnit();
base.OnResize(e);
}
/// <summary>
/// Usability | On enter select everything
/// </summary>
protected override void OnEnter(EventArgs e)
{
this.Select(0, this.Text.Length);
base.OnMouseEnter(e);
}
/// <summary>
/// If, when leaving, text ends with a seperator, cut it out
/// </summary>
protected override void OnLeave(EventArgs e)
{
if(this.Text.EndsWith(System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator))
{
this.Text = this.Text.Substring(0, this.Text.Length - 1);
}
base.OnLeave(e);
}
}
Mein Problem:
Das Etikett deckt derzeit das Ende der Box. Also, wenn ein großer Wert kommt in (oder die Größe niedrig ist) es wird durch das Etikett abgedeckt, wie hier zu sehen:
Ich weiß, dass die NumericUpDown
so etwas wie eine Scroll-Funktion hat, wenn eine eingegeben Wert ist länger als die Größe der Eingabebox. Dies wird am Ende der Box ausgelöst.
Gibt es in irgendeiner Weise die Möglichkeit, etwas wie Padding für den Text in der Box einzurichten? Zum Beispiel die Polsterung auf der rechten Seite auf die Größe meines Etiketts setzen?
Ich mag diese benutzerdefinierte Kontrolle ziemlich viel, aber diese eine letzte Sache ist nervig.
Leider weiß ich nicht, wie man die Eigenschaften eines bestehenden Steuer Nachschlag wie zum Beispiel gibt es ein Verfahren UpdateEditText()
genannt wird. Vielleicht kann mir jemand sagen, wie man diese Basisfunktionen/Eigenschaften nachschaut.
Vielen Dank!
Sie erhalten die "Bildlauf" -Funktion kostenlos, aber es gilt nur für den Text, den das Steuerelement rendert. Sie überlagern einfach ein "Label" an einem bestimmten Punkt. Ich denke, dass Sie wirklich versuchen möchten, den vollständigen Text zurück zum Steuerelement zu liefern und keinen Text selbst zu zeichnen. Das könnte bedeuten, dass Sie sowohl Text als auch Wert verwalten, da der Text dann nicht numerisch wäre. – DonBoitnott
@DonBoitnott Das war mein erster Gedanke.Aber dann realisierte ich, dass ich mich bereits mit meiner Dezimalstelle in den Text packte. Das Teilen dieser Themen wäre also nicht so schlimm (zum Beispiel mit einem Label). Die angenommene Antwort funktioniert hier gut. – C4u