none
NumericUpDownの作成について RRS feed

  • 質問

  • 当方、プログラミングにおいてずぶの素人です。

    最近、WPFで開発を行わなくてはいけない環境になり、日々悩んでおります。

    あまりに初歩的なことで怒られてしまうかもしれませんが、本当に悩んでおりますのでどなたか教えてください。

     

    visual studio2005にてWindowsアプリを作成しております。

    その中でNumericUpDownを複数配置したいのですが、一つまでは作れたのですが、

    この数を増やしたい場合にどのようにロジックを足していけばよろしいでしょうか?

     

    一つ目までのロジックは以下のように作成しました。

     

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Shapes;


    namespace NumericUpDown作成
    {
        /// <summary>
        /// Interaction logic for Window1.xaml
        /// </summary>

        public partial class Window1 : System.Windows.Window
        {

            public Window1()
            {
                InitializeComponent();

                UpdateTextBox();
            }

            /// <summary>
            /// Gets or sets the value assigned to the control.
            /// </summary>
            public decimal Value
            {
                get { return _value; }
                set
                {
                    if (value != _value)
                    {
                        if (MinValue <= value && value <= MaxValue)
                        {
                            _value = value;
                            UpdateTextBox();
                            OnValueChanged(EventArgs.Empty);
                        }
                    }
                }
            }


            private decimal _value = MinValue;


            /// <summary>
            /// Occurs when the Value property changes.
            /// </summary>
            public event EventHandler<EventArgs> ValueChanged;


            /// <summary>
            /// Raises the ValueChanged event.
            /// </summary>
            /// <param name="args">An EventArgs that contains the event data.</param>
            protected virtual void OnValueChanged(EventArgs args)
            {
                EventHandler<EventArgs> handler = ValueChanged;
                if (handler != null)
                {
                    handler(this, args);
                }
            }

            private void kaishiseikyunen_upButton_Click(object sender, EventArgs e)
            {
                if (Value < MaxValue)
                {
                    Value++;
                }
            }

            private void kaishiseikyunen_downButton_Click(object sender, EventArgs e)
            {
                if (Value > MinValue)
                {
                    Value--;
                }
            }

            private void UpdateTextBox()
            {
                valueText_nen.Text = Value.ToString();
            }

            private const decimal MinValue = 1900, MaxValue = 9999;

     

        }
       

    }

    2007年10月22日 7:48

回答

  • UserControlのXAML

    <UserControl x:Class="WindowsApplication1.UserControl1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
      <StackPanel Orientation="Horizontal">
        <Button Click="upButton_Click">+</Button>
        <TextBox x:Name="valueTextBox"/>
        <Button Click="downButton_Click">-</Button>
      </StackPanel>
    </UserControl>

     

     

    UserControlのcs

     public partial class UserControl1 : UserControl
     {
      public UserControl1()
      {
       InitializeComponent();
       UpdateTextBox();
      }

      ///
      /// Gets or sets the value assigned to the control.
      ///
      public decimal Value
      {
       get { return _value; }
       set
       {
        if (value != _value)
        {
         if (MinValue <= value && value <= MaxValue)
         {
          _value = value;
          UpdateTextBox();
          OnValueChanged(EventArgs.Empty);
         }
        }
       }
      }

      private decimal _value = defaultMinValue;

      ///
      /// Occurs when the Value property changes.
      ///
      public event EventHandler ValueChanged;

      ///
      /// Raises the ValueChanged event.
      ///
      /// An EventArgs that contains the event data.
      protected virtual void OnValueChanged(EventArgs args)
      {
       EventHandler handler = ValueChanged;
       if (handler != null)
       {
        handler(this, args);
       }
      }

      private void upButton_Click(object sender, EventArgs e)
      {
       if (Value < MaxValue)
       {
        Value++;
       }
      }

      private void downButton_Click(object sender, EventArgs e)
      {
       if (Value > MinValue)
       {
        Value--;
       }
      }
      private void UpdateTextBox()
      {
       valueTextBox.Text = Value.ToString();
      }

      private decimal minValue = defaultMinValue;

      public decimal MinValue
      {
       get { return minValue; }
       set {
        minValue = value;
        //ここでValueの値を調整
       }
      }

      private decimal maxValue = defaultMaxValue;

      public decimal MaxValue
      {
       get { return maxValue; }
       set {
        maxValue = value;
        //ここでValueの値を調整
       }
      }


      private const decimal defaultMinValue = 1900, defaultMaxValue = 9999;

     }

     

    WindowのXAML

    <Window x:Class="WindowsApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WindowsApplication1"
        Title="WindowsApplication1" Height="300" Width="300"
        >
      <StackPanel>
        <local:UserControl1 x:Name="control1"/>
        <local:UserControl1 x:Name="control2" MinValue="1" MaxValue="12" Value="1"/>
        <local:UserControl1 x:Name="control3" MinValue="1" MaxValue="31" Value="1"/>
      </StackPanel>
    </Window>

     

     

    と、こんな感じで解りますか ?

    本当は、UserControlのプロパティはDependenctPropertyで作成するのが良いのですが、

    提示されたソースから少し変更して実装しました。

    DependenctPropertyについては調べてみてください。あと、Bindingも・・・。
    2007年10月24日 4:45
  •  

    FC-Shiroさん、ありがとうございます!!!!!!!!!!

    こんなド素人に救いの手を差し伸べていただいて感謝の気持ちでいっぱいです。

    おかげでなんとか形にすることができました。

    これからData Binding です。

    2007年10月24日 8:49

すべての返信

  •  

    Window にそのような実装を書くと、コントロールを複数作れませんよね。
    ユーザーコントロールなどにすれば良いです。
    2007年10月22日 8:24
  • 因人さん、お返事ありがとうございます。

    ユーザーコントロールですね。

    作って実装してみようと思うのですが、NumericUpDownコントロールの最大値、最小値など異なる場合はそれぞれユーザーコントロールで作って実装すればいいんですよね?

     

     

    2007年10月22日 9:23
  • 最大値、最小値などについては、ユーザーコントロールのプロパティにします。

    Windowには、作成したユーザーコントロールを配置して、配置したコントロールについて

    必要なプロパティを設定します。

    2007年10月22日 9:41
  • FC-Shiro さんお返事ありがとうございます。

    プロジェクト(WPF)からユーザーコントロール(WPF)を開き、必要なぶんだけNumericUpDownコントロールを作成しました。

    基本的なロジックは最初のものと同じです。

    それぞれのプロパティも設定しており、これらのユーザーコントロールを実装していきたいのですが、ここで行き詰まりました。

    いったいどうすれば・・・

    本当に初歩中の初歩で申し訳ないのですが、複数のユーザーコントロールを配置し、実装するにはどうすればよいでしょうか?

     

    2007年10月23日 6:15
  • UserControlのXAML

    <UserControl x:Class="WindowsApplication1.UserControl1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
      <StackPanel Orientation="Horizontal">
        <Button Click="upButton_Click">+</Button>
        <TextBox x:Name="valueTextBox"/>
        <Button Click="downButton_Click">-</Button>
      </StackPanel>
    </UserControl>

     

     

    UserControlのcs

     public partial class UserControl1 : UserControl
     {
      public UserControl1()
      {
       InitializeComponent();
       UpdateTextBox();
      }

      ///
      /// Gets or sets the value assigned to the control.
      ///
      public decimal Value
      {
       get { return _value; }
       set
       {
        if (value != _value)
        {
         if (MinValue <= value && value <= MaxValue)
         {
          _value = value;
          UpdateTextBox();
          OnValueChanged(EventArgs.Empty);
         }
        }
       }
      }

      private decimal _value = defaultMinValue;

      ///
      /// Occurs when the Value property changes.
      ///
      public event EventHandler ValueChanged;

      ///
      /// Raises the ValueChanged event.
      ///
      /// An EventArgs that contains the event data.
      protected virtual void OnValueChanged(EventArgs args)
      {
       EventHandler handler = ValueChanged;
       if (handler != null)
       {
        handler(this, args);
       }
      }

      private void upButton_Click(object sender, EventArgs e)
      {
       if (Value < MaxValue)
       {
        Value++;
       }
      }

      private void downButton_Click(object sender, EventArgs e)
      {
       if (Value > MinValue)
       {
        Value--;
       }
      }
      private void UpdateTextBox()
      {
       valueTextBox.Text = Value.ToString();
      }

      private decimal minValue = defaultMinValue;

      public decimal MinValue
      {
       get { return minValue; }
       set {
        minValue = value;
        //ここでValueの値を調整
       }
      }

      private decimal maxValue = defaultMaxValue;

      public decimal MaxValue
      {
       get { return maxValue; }
       set {
        maxValue = value;
        //ここでValueの値を調整
       }
      }


      private const decimal defaultMinValue = 1900, defaultMaxValue = 9999;

     }

     

    WindowのXAML

    <Window x:Class="WindowsApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WindowsApplication1"
        Title="WindowsApplication1" Height="300" Width="300"
        >
      <StackPanel>
        <local:UserControl1 x:Name="control1"/>
        <local:UserControl1 x:Name="control2" MinValue="1" MaxValue="12" Value="1"/>
        <local:UserControl1 x:Name="control3" MinValue="1" MaxValue="31" Value="1"/>
      </StackPanel>
    </Window>

     

     

    と、こんな感じで解りますか ?

    本当は、UserControlのプロパティはDependenctPropertyで作成するのが良いのですが、

    提示されたソースから少し変更して実装しました。

    DependenctPropertyについては調べてみてください。あと、Bindingも・・・。
    2007年10月24日 4:45
  •  

    FC-Shiroさん、ありがとうございます!!!!!!!!!!

    こんなド素人に救いの手を差し伸べていただいて感謝の気持ちでいっぱいです。

    おかげでなんとか形にすることができました。

    これからData Binding です。

    2007年10月24日 8:49