2015-06-22 2 views
0

Для моего приложения, которое имеет дело с графикой, я сделал немного DialogBox установить:DialogBox ценностными поверок

  • Max;
  • мин;
  • Главный шаг (шкалы);
  • Незначительный шаг.

Вот захват экрана:

enter image description here

Я хочу проверить несколько вещей, прежде чем разрешить пользователю нажать Ok:

  1. Max> = Min
  2. MaxScale> = MinScale.

Но это не работает, как я бы: Если я устанавливаю Min> Max, текстовое поле красного цвета, но кнопка Ok все еще включена ...

Как я могу исправить это?

Вот мой код:

public partial class AxisPropertiesDial : Form 
{ 
    public AxisPropertiesDial(string title, double max, double min, double majorStep, double minorStep) 
    { 
     Max = max; 
     Min = min; 
     MajorStep = majorStep; 
     MinorStep = minorStep; 
     InitializeComponent(); 

     tbMax.Text = max.ToString(); 
     tbMin.Text = min.ToString(); 
     tbMajStep.Text = majorStep.ToString(); 
     tbMinStep.Text = minorStep.ToString(); 
     Load += OnLoad; 
     Text = "Axis: " + title; 
    } 

    private void OnLoad(object sender, EventArgs e) 
    { 
     SetDesktopLocation(Cursor.Position.X - Size.Width/2, Cursor.Position.Y - Size.Height/2); 
    } 

    public double Max; 
    public double Min; 
    public double MajorStep; 
    public double MinorStep; 

    private void btnOk_Click(object sender, EventArgs e) 
    { 
     Max = Convert.ToDouble(tbMax.Text); 
     Min = Convert.ToDouble(tbMin.Text); 
     MajorStep = Convert.ToDouble(tbMajStep.Text); 
     MinorStep = Convert.ToDouble(tbMinStep.Text); 
    } 

    private void ValidateTextBox(TextBox tb, double save, out double valueToAssign, double compareTo, bool greaterThan) 
    { 
     btnOk.Enabled = false; 
     tb.BackColor = Color.Tomato; 
     if (!Double.TryParse(tb.Text, out valueToAssign)) 
     { 
      valueToAssign = save; 
      return; 
     } 
     if (greaterThan && (valueToAssign >= compareTo) || !greaterThan && (valueToAssign <= compareTo)) 
     { 
      btnOk.Enabled = true; 
      tb.BackColor = Color.White; 
     } 
     else 
     { 
      //Rollback 
      valueToAssign = save; 
     } 
    } 

    private void ValidateAll() 
    { 
     ValidateTextBox(tbMax, Max, out Max, Min, true); 
     ValidateTextBox(tbMin, Min, out Min, Max, false); 
     ValidateTextBox(tbMajStep, MajorStep, out MajorStep, MinorStep, true); 
     ValidateTextBox(tbMinStep, MinorStep, out MinorStep, MajorStep, false); 
    } 

    private void tb_TextChanged(object sender, EventArgs e) 
    { 
     ValidateAll(); 
    } 
} 

ответ

2

Проблема вы пытаетесь включить или отключить кнопку при проверке отдельных текстовых полей, и они противоречивы друг с другом, а не логика должна быть на более высоком уровень. Изменить функцию проверки текстового поля, чтобы вернуть bool, и использовать его в ValidateAll, чтобы определить, следует ли включить кнопку:

private bool ValidateTextBox(TextBox tb, double save, out double valueToAssign, double compareTo, bool greaterThan) 
{ 
    tb.BackColor = Color.Tomato; 
    if (!Double.TryParse(tb.Text, out valueToAssign)) 
    { 
     valueToAssign = save; 
     return false; 
    } 
    if (greaterThan && (valueToAssign >= compareTo) || !greaterThan && (valueToAssign <= compareTo)) 
    { 
     tb.BackColor = Color.White; 
     return true; 
    } 
    else 
    { 
     //Rollback 
     valueToAssign = save; 
     return false; 
    } 
} 

private void ValidateAll() 
{ 
    btnOk.Enabled = 
     ValidateTextBox(tbMax, Max, out Max, Min, true) & 
     ValidateTextBox(tbMin, Min, out Min, Max, false) & 
     ValidateTextBox(tbMajStep, MajorStep, out MajorStep, MinorStep, true) & 
     ValidateTextBox(tbMinStep, MinorStep, out MinorStep, MajorStep, false); 
} 
+0

Это хорошо, * но *, когда я ставлю две ошибки, вторая не включается красный ... Когда я отлаживаю, выполняются только первые два 'ValidateTextBox' ... –

+0

@Thomas Обновлено, чтобы использовать побитовое' & ', а не логическое' && '- это должно все еще функционировать правильно, но обходит оценку короткого замыкания присущий '&&' –