我写过这段代码
private void txtRate_TextChanged(object sender, EventArgs e)
{
try
{
decimal qty;
decimal price;
decimal amt = 0;
qty = Convert.ToDecimal(txtQuantity.Text);
price = Convert.ToDecimal(txtRate.Text);
amt = qty * price;
txtAmount.Text = amt.ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
自动获取txtAmount
文本框中的值,我可以正确使用。
之后我想清除所有文本框,所以我写了这个
txtProdSerName.Text = "";
txtQuantity.Text = "";
txtRate.Text = "";
txtAmount.Text = "";
但我收到错误
输入字符串的格式不正确
因为此处再次发生textchange
事件。
请给我一些关于这个的建议或解决方案
答案 0 :(得分:4)
将代码更改为如下所示:
private void txtRate_TextChanged()
{
try
{
if(txtRate.Text.Trim() == string.Empty) return;
decimal qty;
decimal price;
decimal amt = 0;
qty = Convert.ToDecimal(txtQuantity.Text);
price = Convert.ToDecimal(txtRate.Text);
amt = qty * price;
txtAmount.Text = amt.ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
这样,每次txtRate为空时,都会返回txtRate_TextChanged()
个事件。
答案 1 :(得分:3)
问题: TextChanged
每次Textbox
值更改时都会触发事件。即使您清除TextBox
值并导致异常,它也会被触发。
解决方案1:您可以在清除文本字段之前从unsubscribe
事件TextChanged
清除TextFeilds.so后再次subscribe
清除TextBox值后,由于TextChanged
没有subscribed
事件处理程序,因此无法调用TextChanged
事件。
试试这个:
txtRate.TextChanged -= new System.EventHandler(txtRate_TextChanged);
txtProdSerName.Text = "";
txtQuantity.Text = "";
txtRate.Text = "";
txtAmount.Text = "";
txtRate.TextChanged += new System.EventHandler(txtRate_TextChanged);
解决方案2 :您可以创建boolean
变量并检查它是否真的是TextChanged
事件。
第1步:创建Boolean
变量并将其初始化为true
。
第2步:在清除Boolean
值之前将false
变量值更改为Textbox
。
第3步:清除Boolean
值后,将true
变量更改回Textbox
。
第4步:仅在TextChanged
变量为Boolean
时执行true
事件处理程序代码。
试试这个:
private bool isTextChangedEvent = true;
private void txtRate_TextChanged(object sender, EventArgs e)
{
if(isTextChangedEvent)
{
try
{
decimal qty;
decimal price;
decimal amt = 0;
qty = Convert.ToDecimal(txtQuantity.Text);
price = Convert.ToDecimal(txtRate.Text);
amt = qty * price;
txtAmount.Text = amt.ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
清除TextBox
值时:
isTextChangedEvent = false;
txtProdSerName.Text = "";
txtQuantity.Text = "";
txtRate.Text = "";
txtAmount.Text = "";
isTextChangedEvent = true;
答案 2 :(得分:1)
问题:
当您更改文本时,它会触发事件,在此之前您正在设置
txtQuantity
txtrate
到""
,在这种情况下,您使用的是txtQuantity
txtrate
个值(现在实际上是Empty
,所以他们不能被解析为decimal
)这就是为什么当它尝试更改txtRate
的文本时,它发现txtQuantity
值为""
(空)并抛出异常。
解决方案:
将此代码放在一个单独的方法中:
private void changeTxtRateValue()
{
try
{
decimal qty;
decimal price;
decimal amt = 0;
qty = Convert.ToDecimal(txtQuantity.Text);
price = Convert.ToDecimal(txtRate.Text);
amt = qty * price;
txtAmount.Text = amt.ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
仅在txtQuantity
不是Empty
时调用该方法:
private void txtRate_TextChanged(object sender, EventArgs e)
{
if(txtQuantity.Text != String.Empty)
changeTxtRateValue();
}
最佳做法建议:
请勿使用""
设置字符串empty
,因为它不是empty
。
始终使用String.Empty
。
使用此代码:
txtProdSerName.Text = String.Empty;
txtQuantity.Text = String.Empty;
txtRate.Text = String.Empty;
txtAmount.Text = String.Empty;
它会解决你的问题。
答案 3 :(得分:1)
确保您的txtQuantity.Text
和txtRate.Text
不为空,因为当您清空文本框值时,TextChangeEvent会触发。
private void txtRate_TextChanged(object sender, EventArgs e)
{
try
{
decimal qty;
decimal price;
decimal amt = 0;
if (!String.IsNullOrEmpty(txtQuantity.Text) && !String.IsNullOrEmpty(txtRate.Text))
{
qty = Convert.ToDecimal(txtQuantity.Text);
price = Convert.ToDecimal(txtRate.Text);
amt = qty * price;
txtAmount.Text = amt.ToString();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
答案 4 :(得分:0)
您没有在应用程序中使用正确的控件。请改用NumericUpDown控件。