C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

NumericUpDownのパラメータを全コピーする方法

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■92114 / inTopicNo.1)  NumericUpDownのパラメータを全コピーする方法
  
□投稿者/ 2000 (1回)-(2019/08/27(Tue) 22:55:29)

分類:[.NET 全般] 

NumericUpDownのパラメータを以下のように設定し、

        With NumericUpDown1
            .Minimum = 50
            .Maximum = 5000
            .DecimalPlaces = 1
            .ThousandsSeparator = True
            .Increment = 50
            .Value = 2450
        End With


これを別のNumericUpDown2にも同じパラメータを適用したいのですが
どのようにすれば良いですか?

NumericUpDown2 = NumericUpDown1


でいけるかと思いましたが
うまくいきませんでした。

引用返信 編集キー/
■92115 / inTopicNo.2)  Re[1]: NumericUpDownのパラメータを全コピーする方法
□投稿者/ 魔界の仮面弁士 (2326回)-(2019/08/27(Tue) 23:00:55)
No92114 (2000 さん) に返信
> NumericUpDownのパラメータを以下のように設定し、
> これを別のNumericUpDown2にも同じパラメータを適用したいのですが
> どのようにすれば良いですか?

For Each num In New NumericUpDown() { NumericUpDown1, NumericUpDown2 }
 With num
  .Minimum = 50
  .Maximum = 5000
  .DecimalPlaces = 1
  .ThousandsSeparator = True
  .Increment = 50
  .Value = 2450
 End With
Next

でどうでしょう。
※ ISupportInitialize.BeginEdit & .EndEdit で挟むとなお良し。
引用返信 編集キー/
■92118 / inTopicNo.3)  Re[2]: NumericUpDownのパラメータを全コピーする方法
□投稿者/ 2000 (2回)-(2019/08/28(Wed) 10:10:06)
ありがとうございます。

あるフォームにあるNumericUpDownのパラメータを
別のフォームにあるNumericUpDownにコピーするようなことを想定していたのですが
そういうことはできないのでしょうか?

引用返信 編集キー/
■92119 / inTopicNo.4)  Re[3]: NumericUpDownのパラメータを全コピーする方法
□投稿者/ 魔界の仮面弁士 (2328回)-(2019/08/28(Wed) 10:21:15)
2019/08/28(Wed) 10:46:49 編集(投稿者)

No92118 (2000 さん) に返信
> あるフォームにあるNumericUpDownのパラメータを
> 別のフォームにあるNumericUpDownにコピーするようなことを想定していたのですが
> そういうことはできないのでしょうか?

そうは言っても、名前・座標・サイズ・TabIndex・親フォームまで複製されたら困りますよね?

どのプロパティとどのプロパティを、どの順番で複製するかまで
指定しなければならないので、結局のところ、冗長に見えたとしても、
必要なプロパティを一つ一つ明示してあげるのが近道かと思います。

コピー元のコントロールとコピー先のコントロールが
それぞれ別フォームにあったとしても同じことかと。


Public Sub CopySettings(template As NumericUpDown)
 Dim target As NumericUpDown
 target = Me.NumericUpDown1

 DirectCast(target, ISupportInitialize).BeginInit()
 With target
  .BorderStyle = template.BorderStyle
  .DecimalPlaces = template.DecimalPlaces
  .Hexadecimal = template.Hexadecimal
  .Increment = template.Increment
  .InterceptArrowKeys = template.InterceptArrowKeys
  .Maximum = template.Maximum
  .Minimum = template.Minimum
  .ReadOnly = template.ReadOnly
  .TextAlign = template.TextAlign
  .ThousandsSeparator = template.ThousandsSeparator
  .Value = template.Value
 End With
 DirectCast(target, ISupportInitialize).EndInit()
End Sub
引用返信 編集キー/
■92120 / inTopicNo.5)  Re[4]: NumericUpDownのパラメータを全コピーする方法
□投稿者/ PANG2 (317回)-(2019/08/28(Wed) 12:29:14)
リフレクションで作ってみました。

public void CopySetting<T>(T x, T y) where T : Control
{
	foreach (PropertyInfo p in typeof(T).GetProperties()) {
		if (isBrowsable(p))
			p.SetValue(y, p.GetValue(x));
	}
}

private bool isBrowsable(PropertyInfo p)
{
	if (!p.CanRead || !p.CanWrite)
		return false;
	if (p.DeclaringType == typeof(Control)) //Controlクラスのプロパティは除外
		return false;
	if (p.PropertyType.IsClass) //Class型のプロパティは除外(MenuStripなど)
		return false;
	foreach (Attribute attr in Attribute.GetCustomAttributes(p)) {
		if (attr is BrowsableAttribute) {
			if (!((BrowsableAttribute)attr).Browsable) //Browsable(false)は除外
				return false;
		}
	}
	Debug.WriteLine(p.Name + "\t" + p.PropertyType);
	return true;
}


--
NumericUpDownでコピーされるプロパティ

DecimalPlaces	System.Int32
Hexadecimal	System.Boolean
Increment	System.Decimal
Maximum	System.Decimal
Minimum	System.Decimal
ThousandsSeparator	System.Boolean
Value	System.Decimal
AutoSize	System.Boolean
BackColor	System.Drawing.Color
BorderStyle	System.Windows.Forms.BorderStyle
ForeColor	System.Drawing.Color
InterceptArrowKeys	System.Boolean
MaximumSize	System.Drawing.Size
MinimumSize	System.Drawing.Size
ReadOnly	System.Boolean
TextAlign	System.Windows.Forms.HorizontalAlignment
UpDownAlign	System.Windows.Forms.LeftRightAlignment

引用返信 編集キー/
■92121 / inTopicNo.6)  Re[5]: NumericUpDownのパラメータを全コピーする方法
□投稿者/ 魔界の仮面弁士 (2329回)-(2019/08/28(Wed) 13:28:15)
No92120 (PANG2 さん) に返信
> リフレクションで作ってみました。

なんで C# なのかと思ったら、元質問の分類が
「VB.NET/VB2005 以降」ではなく
「.NET 全般」になっていたんですね。


> public void CopySetting<T>(T x, T y) where T : Control

たとえば、こういうパターンの場合に失敗するかも。

private void button1_Click(object sender, EventArgs e)
{
  numericUpDown1.Hexadecimal = false;
  numericUpDown1.DecimalPlaces = 0;
  numericUpDown1.Maximum = decimal.MaxValue;
  numericUpDown1.Minimum = decimal.MinValue;
  numericUpDown1.Value = numericUpDown1.Maximum;

  numericUpDown2.Hexadecimal = true;
  numericUpDown2.DecimalPlaces = 0;
  numericUpDown2.Maximum = int.MaxValue;
  numericUpDown2.Minimum = int.MinValue;
  numericUpDown2.Value = numericUpDown2.Maximum;

  // TargetInvocationException (InnerException := OverflowException)
  CopySetting(numericUpDown2, numericUpDown1);
}
引用返信 編集キー/
■92122 / inTopicNo.7)  Re[6]: NumericUpDownのパラメータを全コピーする方法
□投稿者/ PANG2 (318回)-(2019/08/28(Wed) 13:38:33)
No92121 (魔界の仮面弁士 さん) に返信
> たとえば、こういうパターンの場合に失敗するかも。

No.92119
で解決されているのですか?
引用返信 編集キー/
■92123 / inTopicNo.8)  Re[7]: NumericUpDownのパラメータを全コピーする方法
□投稿者/ 魔界の仮面弁士 (2330回)-(2019/08/28(Wed) 14:09:06)
2019/08/28(Wed) 14:48:11 編集(投稿者)

No92122 (PANG2 さん) に返信
>>たとえば、こういうパターンの場合に失敗するかも。
> No.92119
> で解決されているのですか?

エラーになるか、成功するか、失敗するか、という質問でしょうか?
そちらの環境での実験結果はどうでしたか?

No92119
 Public Sub CopySettings(template As NumericUpDown)
  Dim target As NumericUpDown
  target = Me.NumericUpDown1
の部分を
 Public Sub CopySettings(target As NumericUpDown, template As NumericUpDown)
な実装に差し替えて、それを

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  NumericUpDown1.Hexadecimal = False
  NumericUpDown1.DecimalPlaces = 0
  NumericUpDown1.Maximum = Decimal.MaxValue
  NumericUpDown1.Minimum = Decimal.MinValue
  NumericUpDown1.Value = NumericUpDown1.Maximum

  NumericUpDown2.Hexadecimal = True
  NumericUpDown2.DecimalPlaces = 0
  NumericUpDown2.Maximum = Integer.MaxValue
  NumericUpDown2.Minimum = Integer.MinValue
  NumericUpDown2.Value = NumericUpDown2.Maximum

  CopySettings(NumericUpDown2, NumericUpDown1)
End Sub

として呼んだ場合、例外を発することなく複製されるという点までは確認しました。

しかし、もしも CopySettings の実装を

Public Sub CopySettings(target As NumericUpDown, template As NumericUpDown)
 'DirectCast(target, ISupportInitialize).BeginInit()
 With target
  .Hexadecimal = template.Hexadecimal
  .Increment = template.Increment
  .Maximum = template.Maximum
  .Minimum = template.Minimum
  .ThousandsSeparator = template.ThousandsSeparator
  .Value = template.Value
 End With
 'DirectCast(target, ISupportInitialize).EndInit()
End Sub

とした場合には、Hexadecimal の転送時点で OverflowException がスローされることになりました。

ISupportInitialize を有効にしていた場合は例外は発生しませんでしたが、
ISupportInitialize 無しで設定しようとするならば、依存関係にある
プロパティの内容を考慮しながら値を設定していく必要がありそうです。


その点が、 No92115 で触れた
>> ※ ISupportInitialize.BeginEdit & .EndEdit で挟むとなお良し。
や、 No92119 でも触れた
>> どのプロパティとどのプロパティを、どの順番で複製するか
という点に繋がってきます。

特にコントロールの場合、ValueChagned 等のイベントを設定して
いることがあるかと思いますが、設定コピー時に、そうしたイベントが
呼ばれて欲しいケースもあれば、呼ばれて欲しくないケースもあるでしょう。
あるいは、設定のコピー中はイベントが発生しないようにして、すべての
コピーが完了した後で呼び出される方が都合が良いかもしれません。

また、データバインド設定が影響してくる可能性もあるでしょう。

こうした点は、それぞれのアプリの実装状況によっても
変わってくるかと思いますので、汎用的なコピー実装を設ける場合、
そうした点も気に掛ける必要があるかもしれません。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ