textchange的输入字符串格式不正确

时间:2013-12-25 07:34:22

标签: c# winforms textbox

我写过这段代码

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事件。

请给我一些关于这个的建议或解决方案

5 个答案:

答案 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.TexttxtRate.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控件。