2016-08-21 18 views
0

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に等しいです。

+0

私はそれがないと確信しています。私が逃したことを説明してもらえますか? –

答えて

2

代わりに内部値を変更してテキストを更新しようとしましたか?そうすれば、イベントハンドラが起動されるのを回避できます。

あなたがソースコード(http://referencesource.microsoft.com/System.Windows.Forms/winforms/Managed/System/WinForms/NumericUpDown.cs.html#0aaedcc47a6cf725)を見てみる場合は あなたは、プロパティの値は、これはあなたが設定したい値であるcurrentValueというプライベートフィールドを使用していることがわかります。そして、その後ちょうどcontrol.Text = value.ToString();

private void SetNumericUpDownValue(NumericUpDown control, decimal value) 
{ 
    if (control == null) throw new ArgumentNullException(nameof(control)); 
    var currentValueField = control.GetType().GetField("currentValue", BindingFlags.Instance | BindingFlags.NonPublic); 
    if (currentValueField != null) 
    { 
     currentValueField.SetValue(control, value); 
     control.Text = value.ToString(); 
    } 
} 

このhasntはテストされて私はそれが動作しますかなり確信してください。 :) ハッピーコーディング!

+0

この場合、 'currentValueField'はnullです。 –

+0

haha​​ha私の悪い!私は偶発的に書き込みました: "this.GetType()..." もう一度やり直してください。) 'this.GetType()'を 'control.GetType()'に置き換えてください。 –

+0

Great !! !大いに感謝する!!! –

関連する問題