我正在一个项目中工作,它必须导入excel文件并在3个不同的数据网格中显示其详细信息。我在这里有一个带代码的按钮。
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());
}
}
并且它输出错误,输入字符串格式不正确。有人帮助我。谢谢
答案 0 :(得分:2)
这是经典的调试101,除非你是第一次编写无错代码的Kwisatz Haderach编码,否则在你的职业生涯早期学习它是个好主意:-)
每次尝试使用以下内容进行转换之前
Convert.ToInt32(blah)
(我在你的代码中看到其中的四个,一行中有两个),你应该输入一些临时的调试代码(消息框,或者控制台,或者某些东西)来找出blah
实际上是什么调成。这应包括实际字符串,由[]
字符包围,以及字符串的长度。
这将让您识别哪个字符串未通过整数转换。一旦你确定了这一点, next 步骤将解决原因。
答案 1 :(得分:0)
你的异常是由Convert.ToInt32(...)发生的 - 你多次使用它...这意味着在某些时候没有传递给这个函数的数字的字符串
我的猜测是数据库中的某些字段包含null并由空字符串
表示然后Convert.ToInt32可以处理它在空字符串值上失败的空值
潜在的解决方案 - 使用您自己的方法:
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
}
答案 2 :(得分:0)
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;
}
}
}
错误是您正在转换错误的整数值。你的代码结构也很糟糕。你应该避免嵌套if。我写了代码应该是怎么样的。也是为什么要捕获系统异常,没有用户关心它们。你应该显示相关的文字。
答案 3 :(得分:-1)
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());
}
}