ValueChangedイベント(WinForms、C#)を発生させずにNumericUpDownコントロールの値を更新する必要があります。
簡単な方法は次のようにイベントハンドラを削除することです:必要な値に設定する。その後ValueChangedイベント(Winforms)を発生させずにNumericUpDownコントロールの値を更新します。
numericUpDown.ValueChanged -= numericUpDown_ValueChanged;
:
numericUpDown.Value = 15;
をそして再びイベントハンドラを追加する:
numericUpDown.ValueChanged += numericUpDown_ValueChanged;
問題は、最初のパラメータとしてNumericUpDownコントロールを取得し、2番目のパラメータとして必要な値を取得し、vを更新するメソッドを記述したいということです。次のように与えられています。
これを行うには、ValueChangedイベントの接続されたイベントハンドラ(各NumericUpDownごとに異なります)を見つける必要があります。
私は多くを検索しましたが、私にとってはうまくいく解決策が見つかりませんでした。
私の最後の試みでした:
private void NumericUpDownSetValueWithoutValueChangedEvent(NumericUpDown control, decimal value)
{
EventHandlerList events = (EventHandlerList)typeof(Component).GetField("events", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField).GetValue(control);
object current = events.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField)[0].GetValue(events);
List<Delegate> delegates = new List<Delegate>();
while (current != null)
{
delegates.Add((Delegate)GetField(current, "handler"));
current = GetField(current, "next");
}
foreach (Delegate d in delegates)
{
Debug.WriteLine(d.ToString());
}
}
public static object GetField(object listItem, string fieldName)
{
return listItem.GetType().GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField).GetValue(listItem);
}
NumericUpDownSetValueWithoutValueChangedEvent関数の実行後、object current
はそうEventHandlerが見つかりませんでした誰もが(私はフォーム上でそれを試した - すべてのイベントハンドラが発見された)、nullに等しいです。
私はそれがないと確信しています。私が逃したことを説明してもらえますか? –