-3

假设我希望某人一次只能输入一个输入,例如:将是....假设我只想要 1.80 的一种茶,并且每次他们在 1.80 后打茶时都将其发送到 txtBox,仅此而已会出现。什么是编译这个最有效方式的最佳方式。关键词:高效。

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

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

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();
    }

}

}

4

3 回答 3

2

使用单选按钮将您的选项显示为茶、咖啡……并且值传递值。这样,只有一个选择/输入是可能的。回复单选按钮选择。

于 2013-09-07T04:55:24.367 回答
2

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

创建私有方法:

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

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

于 2013-09-07T03:45:47.613 回答
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),您不必再次编写所有状态管理代码。

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

于 2013-09-07T05:17:20.437 回答