错误inputstring的格式不正确c#

即时通讯工作在一个项目,它必须导入excel文件,并在3个不同的数据网格显示其细节。我有一个代码在这里的button。

private void btn1_Click(object sender, EventArgs e) { try { if (Convert.ToInt32(txtreg.Text) > 0) { for (int i = 0; i < dgResult1.Columns.Count; i++) { if (dgResult1.Columns[i].HeaderText == "REGHRS") { for (int j = 0; j < dgResult1.Rows.Count; j++) { if (Convert.ToInt32(dgResult1.Rows[j].Cells["REGHRS"].Value.ToString()) >= 12) { dgResult1.Rows[j].Cells["REGHRS"].Value = txtreg.Text; dgResult2.Rows[j].Cells["REGHRS"].Value = Convert.ToInt32(dgResult2.Rows[j].Cells["REGHRS"].Value.ToString().Trim()) - Convert.ToInt32(txtreg.Text); dgResult3.Rows[j].Cells["REGHRS"].Value = 0; } } } } } } catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); } } 

它会抛出一个错误inputstring是不是在一个正确的格式。有人可以帮助我。谢谢

这是经典的debugging101,除非你是编码Kwisatz Haderach,他可以在第一次编写无错代码的时候,在你的职业生涯早期学习它是一个好主意.–)

每次在尝试使用类似的转换之前

 Convert.ToInt32(blah) 

(我在你的代码中看到了四个,两个在一行上),你应该input一些临时debugging代码(消息框,或者控制台的写入线,或者其他的东西)来找出实际设置的内容。 这应该包括实际的string,由[]字符围绕,以及string的长度。

这将让你识别哪个string失败的整数转换。 一旦你确定了, 下一步就是找出原因。

处理Convert.ToInt32

你的exception发生Convert.ToInt32(…) – 你使用它几次..这意味着在某些时候一个没有数字的string传递给这个函数

我的猜测是,数据库中的某些字段包含空值,并由空string表示

althougth Convert.ToInt32可以处理空string值时失败的值

一个潜在的解决scheme – 使用自己的方法:

 int ConvertInt(string val) { return (val.IsNullOrEmpty(val)) ? 0 : int.Parse(val); // Parse aimed to deal with strings only while Convert deals withe several types } 
  private void btn1_Click(object sender, EventArgs e) { int regNumber = 0; bool regFlag = int.TryParse(txtreg.Text, regNumber) if(!regFlag) { MessageBox.Show("Reg textbox doesn't have integer value"); return; } if(regNumber <= 0) { MessageBox.Show("Reg textbox has negative or 0 value"); return; } for (int i = 0; i < dgResult1.Columns.Count; i++) { if (dgResult1.Columns[i].HeaderText != "REGHRS") continue; for (int j = 0; j < dgResult1.Rows.Count; j++) { string regHrs = dgResult1.Rows[j].Cells["REGHRS"].Value.ToString(); int regValue = 0; bool regCheck = int.TryParse(regHrs, out regValue) if(!regCheck || reg < 12) continue; dgResult1.Rows[j].Cells["REGHRS"].Value = txtreg.Text; //till now both converts should be okay. dgResult2.Rows[j].Cells["REGHRS"].Value = Convert.ToInt32(dgResult2.Rows[j].Cells["REGHRS"].Value.ToString()) - Convert.ToInt32(txtreg.Text); dgResult3.Rows[j].Cells["REGHRS"].Value = 0; } } } 

错误是你正在转换某处错误的整数值。 你也有非常糟糕的代码结构。 你应该避免嵌套如果。 我写了代码应该如何看起来像。 另外为什么捕捉系统例外,没有用户关心他们。 你应该显示相关的文字。

 Below is my opinion private void btn1_Click(object sender, EventArgs e) { try { if (Convert.ToInt32(txtreg.Text) > 0) { for (int i = 0; i < dgResult1.Columns.Count; i++) { if (dgResult1.Columns[i].HeaderText == "REGHRS") { for (int j = 0; j < dgResult1.Rows.Count; j++) { if (Convert.ToInt32(dgResult1.Rows[j].Cells["REGHRS"].Value.ToString()) >= 12) { dgResult1.Rows[j].Cells["REGHRS"].Value = txtreg.Text; dgResult2.Rows[j].Cells["REGHRS"].Value = Convert.ToInt32(dgResult2.Rows[j].Cells["REGHRS"].Value.ToString().Trim()) - Convert.ToInt32(txtreg.Text); dgResult3.Rows[j].Cells["REGHRS"].Value = "0";//UpDate this } } } } } } catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); } }