阻止更多投入的最佳方式

时间:2013-09-07 03:33:16

标签: c# asp.net asp.net-mvc

让我们假设我希望某人一次只能输入一个输入,EX:会....我说我只想要1.80的一茶,每次他们在1.80被发送到txtBox后都会喝茶什么都不会出现。以最有效的方式编译这个最好的方法是什么。关键字:高效。

编辑:我不是要求代码,所以在粉碎负点箭头之前,请记住我要求的是想法而不是代码。这不是“告诉我如何做到这一点” - 你会用文字而不是实际代码推荐它。

EDIT :: AGAIN ::具体来说,我正在寻找更好的方法来做到这一点。这个代码确实有用。它只允许我输入一次。我只是想知道一种更有效的方法来做到这一点。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    string c;
    double num1;
    double num2;
    private bool inputStatus = true;

    private void Coffee_Click(object sender, EventArgs e)
    {
        txtBox.Text += 3.00;
    }
    private void Tea_Click(object sender, EventArgs e)
    {
        txtBox.Text += 1.80;
    }
    private void Cream_Click(object sender, EventArgs e)
    {
        txtBox.Text += .15;
    }
    private void Total_Click(object sender, EventArgs e)
    {
        double Total;
        num2 = double.Parse(txtBox.Text);

        switch (c)
        {
            case "+":
                Total = num1 + num2;
                txtBox.Text = Total.ToString();
                num1 = 0;
                break;
        }
    }
    private void Add_Click(object sender, EventArgs e)
    {
        num1 = num1 + double.Parse(txtBox.Text);
        c = "+";
        txtBox.Clear();
    }
    private void Cinnamon_Click(object sender, EventArgs e)
    {
        if (inputStatus)
        {
            if (txtBox.Text.Length <= 1)
            {
                txtBox.Text += .30;
            }
        }
    }
    private void Sugar_Click(object sender, EventArgs e)
    {
        txtBox.Text += .50;
    }

    private void Whippedcream_Click(object sender, EventArgs e)
    {
        txtBox.Text += .70;
    }
    private void Clear_Click(object sender, EventArgs e)
    {
        txtBox.Clear();
    }

}

}

3 个答案:

答案 0 :(得分:2)

快速思考:点击项目按钮后,只启用添加/清除/总计按钮。所有其他项目按钮将被禁用。因此,唯一的可能是单击启用的按钮。单击添加/清除/总计按钮后,只需启用所有其他项目按钮。

创建私有方法:

private void DisableEnableAllItemButtons(bool state) 
{ 
  btn1.enabled=state; 
  btn2.enabled=state; 
  /* and so on */  
} 

此方法将根据state参数更改按钮的启用/撤消状态。在所有项目按钮的单击事件处理程序中调用DisableEnableAllItemButtons(false),然后仅启用添加/清除/总计按钮。您还可以创建另一种方法来启用/禁用添加/清除/总计按钮,就像我们对项目按钮所做的那样。

答案 1 :(得分:2)

使用单选按钮显示您的选项茶,咖啡......并且值传递值。以这种方式,只有一个选择/输入是可能的。在单选按钮选择上回复帖子。

答案 2 :(得分:1)

考虑编写一个维持饮料状态的类(或类集)。毕竟,饮料的状态确实不应该是形式的关注(除了如何显示它)。根据饮料的状态更新表单状态变得简单。

考虑一组这样的类:

public interface IBeverage { 
  double Price { get; } 
}

public abstract class Beverage : IBeverage {
  public abstract double Price { get; }
}

public class Coffee : Beverage { 
  public override double Price {
    get {
      return 3.00;
    }
  }
}

public class Tea : Beverage { 
  public override double Price {
    get {
      return 2.00;
    }
  }
}

public class Cream : Beverage { 
  public override double Price { 
    get { 
      return .15;
    }
  }
}

它们是咖啡,茶和奶油的简单表示(问题中的例子)。通过表示与您的表单分开的饮料,您可以拥有另一个为您管理州的课程:

public class BeverageManager { 
  private List<Beverage> _beverage = new List<Beverage>();
  private List<Type> _types = new List<Type>();
  private HashSet<Type> _multipleAllows = new HashSet<Type>();

  public BeverageManager(Type[] multipleAllows) {  
    foreach (var allowed in multipleAllows)
      _multipleAllows.Add(allowed); 
  }

  public double Price { 
    get { 
      return (from bev in _beverage
              select bev.Price).Sum();
    }
  }

  public bool HasType(Type t) { 
    return _types.Contains(t); 
  }

  public bool AddBeverage(Beverage bev) { 
    if (HasType(bev.GetType()) && !_multipleAllows.Contains(bev.GetType()))
      return false; 
    _types.Add(bev.GetType()); 
    _beverage.Add(bev); 
    return true; 
  }
}

为什么要解决所有这些问题只是为了保持表单的启用/禁用状态顺序?因为您的表单不必关心管理它显示的状态。通过此实现,您可以使用以下代码:

private void _updateFormState() { 
  if (_bevMgr.HasType(typeof(Coffee) || typeof(Tea)) { 
    // disable coffee and tea buttons
  }
}

而且,如果您发现自己需要迁移饮料跟踪器(或者您正在编程的任何东西:D),您不必再次编写所有状态管理代码。

请注意:我的实施是为了展示国家管理和责任分离的概念。它不是特别可扩展的(例如,如果您以后需要添加新类型的饮料,则需要编写代码)。更可能的解决方案是从数据库或其他来源加载有关饮料的数据,并编写饮料管理器来处理该情况 - 但是,出于同样的原因,为什么将这些功能分开仍然是个好主意。