2010-03-03 3 views
2

Я использую элемент управления numericupdown. Когда значение назначается программно или пользователь меняет значение, запускается событие ValueChanged.C# winforms numericupdown управление

Я хочу, чтобы событие запускалось только тогда, когда пользователь меняет значения, а не когда я устанавливаю минимальное и максимальное значения. Как это можно сделать?

ответ

3

Попробуйте что-то вроде этого:

var changeFromCode = false; 

void abc() 
{ 
    // This is where you change value in code. 
    changeFromCode = true; 
    ud1.Value = 15; 
    changeFromCode = false; 
} 

// Sorry, I am not sure about handler signatures 
void UpDownValueChanged(object sender, EventArgs e) 
{ 
    if (changeFromCode) 
     return; 
} 
+0

+1, просто легко, и это работает. –

+0

Решение прост и работает – Raghavendra

4

Опираясь на ответ TheVillageIdiot в ... Вы можете создать многоразовый подкласс, как:

public sealed class MyNumericUpDown : NumericUpDown { 

    private bool suppress; 

    protected override void OnValueChanged(EventArgs e) { 
     if (!suppress) { 
      base.OnValueChanged(e); 
     } 
    } 

    public void SetRange(decimal min, decimal max) { 
     suppress = true; 
     try { 
      Minimum = min; 
      Maximum = max; 
     } 
     finally { 
      suppress = false; 
     } 
    } 

} 
+0

+1 Мне нравится, как вы перевели решение на более высокий уровень абстракции, и я думаю, что я мог бы использовать подобную стратегию в частых случаях, когда мне нужно подавить рекурсию как две (или более) «синхронизированных» элементов управления (например, TreeView и Listview). Любопытство: если вы хотите добавить комментарии о том, почему вы сделали класс закрытым, и почему вы использовали блок try/catch, это было бы оценено. Благодаря ! – BillW

+1

У меня есть привычка к печати по умолчанию. В этом случае это не имеет значения. Что касается try/finally - это еще одна привычка избегать случая, когда исключение выходит из метода, оставляющего suppress set равным true. Хотя в этом случае я не знаю, возможно ли исключение, всегда рекомендуется, чтобы вы вернули флаг так, как это было. – Josh

+0

+1 Спасибо за ваш ответ, Джош. Мне потребовалось менее пяти минут, чтобы реализовать выведенное TreeView и ListView с рекурсивным доказательством, с рекурсией, контролируемой публичным свойством в каждом, и убедиться, что они работали должным образом: один недостаток: вы должны изменить файл Designer.cs или взломайте их сами, задайте бесчисленные свойства самостоятельно или, по крайней мере, создайте элементы управления по умолчанию, затем скопируйте настройки из класса Designer.cs и «пересадите» их в другое место, затем зайдите и переключите объявления на ваши производные типы. Я вообще не против, когда-либо приближаюсь к файлу Designer.cs. – BillW

Смежные вопросы