1

NumericUpDownnull許容値を受け取ることができるこのカスタムクラスを見つけました。私はそれを編集フォームで使用します。編集フォームは空にすることも、null許容値の必要性が生じるデータベースからのデータを入力することもできます。

これは現在のコードです:

public partial class NullableNumericUpDown : NumericUpDown
    {
        public NullableNumericUpDown()
        {
            InitializeComponent();
        }

        public NullableNumericUpDown(IContainer container)
        {
            container.Add(this);

            InitializeComponent();
        }



        private int? _value;

        [Bindable(true)]
        public new int? Value
        {
            get
            {
                return _value;
            }
            set
            {
                _value = value;
                if (value != null)
                {
                    base.Value = (int)value;
                    Text = Value.ToString();
                }
                else
                {
                    Text = "";
                }
            }
        }

        private void NullableNumericUpDown_ValueChanged(object sender, EventArgs e)
        {
            _value = (int)base.Value;
        }



        void NullableNumericUpDown_TextChanged(object sender, System.EventArgs e)
        {
            if (Text == "")
            {
                _value = null;
            }
        }
    }

私はC#にかなり慣れていないので、コードを完全に理解しているとは言えませんが、フォームにデータベースからのデータを入力するときと、正確にNullableNumericUpDown値がある場合に問題が発生します。たとえば、- 3。この値をに変更すると5、フォームにファイルされたデータからデータを収集したときの最終結果はです53。また、削除3してから増分矢印を押すと、が表示されます4。このコントロールのライフサイクル全体で初期データが保存されているようです。0役立つと思われる現在の場所に設定しようとしましたが、そうではなく、この初期データを削除する必要があるという事実に加えて、コントロールの値が実際に変更された場合の値それを作成するだけでは十分ではありません0私が空のコントロールを持っている場合、これは問題なく、null代わりにとして記録する必要があります0

ここで完了するのは、NullableNumericUpDownコントロールのデータを設定する方法です。

numUpDnAreas.Value = entity.AreasCnt;

form_loadこれは私のイベントで起こります。そして、Saveボタンをクリックすると、これでデータを収集します:

entity.AreasCnt = numUpDnAreas.Value;

このコードは私のニーズに合わせてリファクタリングできますか、それともそのままにして、MaskedTextBoxまたは他のようなものを使用する必要がありますか?

4

2 に答える 2

1

拡張WPFツールキットのUpDownコントロールを使用してみてください。http://wpftoolkit.codeplex.com/wikipage?title=DecimalUpDown&referringTitle=Home それはあなたの問題を解決するかもしれず、オープンソースです。

プロジェクトにも同様の要件があり、テキストボックスをラップするカスタムコントロールを作成し、Bindingを設定することで独自の要件を作成することになりました。String.emptyへのAllowNullValue

于 2013-03-14T10:41:37.083 に答える
0

実例があります:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace NumericUpDownNullableProj
{
    /// <summary>
    /// Represents a Windows spin box (also known as an up-down control) that displays numeric values.
    /// </summary>
    [ClassInterface(ClassInterfaceType.AutoDispatch)]
    [ComVisible(true)]
    [DefaultBindingProperty("Value")]
    [DefaultEvent("ValueChanged")]
    [DefaultProperty("Value")]
    //[SRDescriptionAttribute("DescriptionNumericUpDown")]
    public class NumericUpDownNullable : NumericUpDown
    {
        public NumericUpDownNullable() : base()
        {
            Text = "";

            ValueChanged += NumericUpDownNullable_ValueChanged;
            TextChanged += NumericUpDownNullable_TextChanged;
        }

        public NumericUpDownNullable(IContainer container) : this()
        {
            container.Add(this);
        }

        private void NumericUpDownNullable_TextChanged(object sender, EventArgs e)
        {
            if (Text == "")
            {
                Value = null;
            }
        }

        private void NumericUpDownNullable_ValueChanged(object sender, EventArgs e)
        {
            if (Value != base.Value)
            {
                Value = base.Value;
            }
        }

        private decimal? _value;
        /// <summary>
        /// Gets or sets the value assigned to the spin box (also known as an up-down control).
        /// 
        /// Returns:
        ///      The numeric value of the System.Windows.Forms.NumericUpDown control.
        /// Exceptions:
        ///    T:System.ArgumentOutOfRangeException:
        ///       The assigned value is less than the System.Windows.Forms.NumericUpDown.Minimum
        ///       property value.-or- The assigned value is greater than the System.Windows.Forms.NumericUpDown.Maximum property value.
        /// </summary>
        [Bindable(true)]
        public new decimal? Value
        {
            get
            {
                return _value;
            }
            set
            {
                _value = value;

                if (base.Value != value.GetValueOrDefault())
                {
                    base.Value = value.GetValueOrDefault();
                }

                Text = value?.ToString();
            }
        }
    }
}
于 2018-07-10T23:45:28.960 に答える