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

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

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

NumericUpDown_ValueChangedに関して

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

■90688 / inTopicNo.1)  NumericUpDown_ValueChangedに関して
  
□投稿者/ 体感 (1回)-(2019/04/08(Mon) 09:54:40)

分類:[.NET 全般] 

NumericUpDownに変更があった場合、

Private Sub NumericUpDown3_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown3.ValueChanged


が呼び出されます。
この時、ユーザーがフォームを変更したことにより呼び出されたのか、

NumericUpDown3.Value = 50
のようして、コード内で呼び出されたのかを
判定してIf文で分岐したいのですが
どのようにすれば調べられますでしょうか?



引用返信 編集キー/
■90690 / inTopicNo.2)  Re[1]: NumericUpDown_ValueChangedに関して
□投稿者/ 774RR (677回)-(2019/04/08(Mon) 10:27:39)
こんなのは見つけた
https://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=31545&forum=7

マルチスレッドでの競合を考えなければ(ってか UI 部品は STA)値をセットする側
numericUpDown1.Tag = null 以外;
numericUpDown1.Value = 新しい値;

同じく ValueChanged で Tag を判定して null に戻す

なんてのは簡単で大いにアリだと思う。
自分でこのコードを実用に供するかというとどうかしら? そもそもその手の判定不要に書きたい。


引用返信 編集キー/
■90691 / inTopicNo.3)  Re[1]: NumericUpDown_ValueChangedに関して
□投稿者/ Hongliang (780回)-(2019/04/08(Mon) 10:28:43)
Boolean型のメンバ変数を用意して、コードで変更する際に

m_ChangingFromCode = True
NumericUpDown3.Value = 50
m_ChangingFromCode = False

のように記述することになりますね。

// 実現したいことによってはそもそもその判断自体が不要になるかもしれませんが。
引用返信 編集キー/
■90694 / inTopicNo.4)  Re[2]: NumericUpDown_ValueChangedに関して
□投稿者/ PANG2 (276回)-(2019/04/08(Mon) 15:33:44)
StackFrameで判断するとか。

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
	MessageBox.Show("CalledByCode=" + CalledByCode(sender));
}

private bool CalledByCode(object sender)
{
	bool fromControl = false;
	foreach(StackFrame sf in new StackTrace(false).GetFrames()) {
		MethodBase m = sf.GetMethod();
		//Debug.WriteLine(m.Name + "\t" + m.ReflectedType);
		if (!fromControl) {
			if (m.ReflectedType == sender.GetType())
				fromControl = true;
		} else if (m.ReflectedType.Namespace.StartsWith("System.Windows.Forms")) {
			if (m.Name == "WndProc")
				return false;
		} else {
			return true; //System.Windows.Forms 以外から呼ばれた
		}
	}
	return false;
}

引用返信 編集キー/
■90696 / inTopicNo.5)  Re[3]: NumericUpDown_ValueChangedに関して
□投稿者/ 体感 (3回)-(2019/04/09(Tue) 10:51:13)
ありがとうございます。
Booleanの方法ではうまくいきました。


private bool CalledByCode(object sender)

の方が使い勝手がよさそうなので
こちらを使いたいのですが
GetFrames
のところで宣言されていない、というエラーが出てしまいます。
どのように改良すれば良いでしょうか?

引用返信 編集キー/
■90697 / inTopicNo.6)  Re[4]: NumericUpDown_ValueChangedに関して
□投稿者/ 体感 (4回)-(2019/04/09(Tue) 10:54:08)
ちなみにVBで実行するために以下のように変換しています。

Private Function CalledByCode(ByVal sender As Object) As Boolean
Dim fromControl As Boolean = False
' Dim st As StackTrace = New StackTrace(False)

For Each sf As StackFrame In (New StackTrace(False) + GetFrames)
Dim m As MethodBase = sf.GetMethod
'Debug.WriteLine(m.Name + "\t" + m.ReflectedType);
If Not fromControl Then
If (m.ReflectedType = sender.GetType) Then
fromControl = True
End If

ElseIf m.ReflectedType.Namespace.StartsWith("System.Windows.Forms") Then
If (m.Name = "WndProc") Then
Return False
End If

Else
Return True
'System.Windows.Forms &#65533;K&#65533;|p&#65533;_
End If

Next
Return False
End Function


引用返信 編集キー/
■90698 / inTopicNo.7)  Re[5]: NumericUpDown_ValueChangedに関して
□投稿者/ 魔界の仮面弁士 (2141回)-(2019/04/09(Tue) 11:46:40)
No90697 (体感 さん) に返信
>> foreach(StackFrame sf in new StackTrace(false).GetFrames()) {
> ちなみにVBで実行するために以下のように変換しています。
>  For Each sf As StackFrame In (New StackTrace(False) + GetFrames)

何故から「+」演算子が使われているようですが、
Visual Basic に翻訳するなら、この部分は、
 For Each sf As StackFrame In New StackTrace(False).GetFrames()
となるべきですね。


なお、提示のコードを実行するには、.NET Framework 4 以上が必要になります。

.NET Framework 3.5 以下の場合は、
> If (m.ReflectedType = sender.GetType) Then
がサポートされていないので、この行を
 If m.ReflectedType.Equals(sender.GetType()) Then
に置き換える必要があります。

引用返信 編集キー/
■90699 / inTopicNo.8)  Re[6]: NumericUpDown_ValueChangedに関して
□投稿者/ 体感 (5回)-(2019/04/09(Tue) 12:05:25)
ありがとうございます。

うまくいきました。

しかし、いま気が付いたのですが、


Private Sub NumericUpDown_MouseWheel(ByVal sender As Object, ByVal e As MouseEventArgs)

Dim NUD As NumericUpDown = CType(sender, NumericUpDown)

・・・・色々なコード

NUD.Value = CDec(Value0)


CType(e, HandledMouseEventArgs).Handled = True

End Sub


のようにしてホイールを回した時の挙動で
AddHandlerしているのですが、
そのため、ホイールを回した時には
コードから実行することになってしまいます。

これは、もうBoolを使うしかないでしょうか?




引用返信 編集キー/
■90701 / inTopicNo.9)  Re[7]: NumericUpDown_ValueChangedに関して
□投稿者/ Azulean (1050回)-(2019/04/09(Tue) 21:40:47)
No90699 (体感 さん) に返信
> のようにしてホイールを回した時の挙動でAddHandlerしているのですが、
> そのため、ホイールを回した時にはコードから実行することになってしまいます。

事実、コードから実行していますので間違ってはいません。

> これは、もうBoolを使うしかないでしょうか?

コードからの実行でも制御したい事例がある以上は、フラグ管理するか、イベントハンドラの一時的な解除・再設定などするしかないでしょう。
あとは、ValueChanged 側でユーザー操作以外であっても大丈夫なように作り替えるかです。
引用返信 編集キー/
■90702 / inTopicNo.10)  Re[8]: NumericUpDown_ValueChangedに関して
□投稿者/ PANG2 (277回)-(2019/04/09(Tue) 23:01:55)
NumericUpDownを継承するクラスでOnMouseWheelとOnValueChangedを独自実装すればいいでしょう
引用返信 編集キー/
■90705 / inTopicNo.11)  Re[9]: NumericUpDown_ValueChangedに関して
□投稿者/ 通りすがり (8回)-(2019/04/10(Wed) 10:07:39)
2019/04/12(Fri) 17:12:10 編集(投稿者)
2019/04/10(Wed) 11:32:55 編集(投稿者)
2019/04/10(Wed) 10:51:11 編集(投稿者)
2019/04/10(Wed) 10:50:23 編集(投稿者)
2019/04/10(Wed) 10:50:07 編集(投稿者)
2019/04/10(Wed) 10:33:57 編集(投稿者)




引用返信 編集キー/

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


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

このトピックに書きこむ