让我们假设我希望某人一次只能输入一个输入,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();
}
}
}
答案 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),您不必再次编写所有状态管理代码。
请注意:我的实施是为了展示国家管理和责任分离的概念。它不是特别可扩展的(例如,如果您以后需要添加新类型的饮料,则需要编写代码)。更可能的解决方案是从数据库或其他来源加载有关饮料的数据,并编写饮料管理器来处理该情况 - 但是,出于同样的原因,为什么将这些功能分开仍然是个好主意。