datagridview上的异常(nullreferenceexception) [英] Exception (nullreferenceexception) on datagridview

查看:500
本文介绍了datagridview上的异常(nullreferenceexception)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人可以帮我理解我的代码问题吗?它始终是异常,如果我尝试用NULL处理单元格无关紧要。



我的捕获System.Exception错误是:

对象引用未设置为对象的实例







< pre lang =c#> 尝试
{

worksheet = workbook.ActiveSheet;

worksheet.Name = ExportedFromDatGrid;

int cellRowIndex = 1 ;
int cellColumnIndex = 1 ;


// 遍历每一行并从每列读取值。
for int i = -1; i < dataGridView1.Rows.Count - 1 ; i ++)
{
for int j = 0 ; j < dataGridView1.Columns.Count; j ++)
{
// Excel索引从1,1开始。由于第一行将具有列标题,因此添加条件检查。
if (cellRowIndex == 1
{
worksheet.Cells [cellRowIndex,cellColumnIndex] = dataGridView1.Columns [j] .HeaderText;
}
其他
{

如果(dataGridView1.Rows [i] .Cells [j] .Value.ToString()!= null
{
worksheet.Cells [cellRowIndex,cellColumnIndex] = dataGridView1.Rows [i] .Cells [j] .Value.ToString();
}
else
{
worksheet.Cells [cellRowIndex,cellColumnIndex] = 字符串 .Empty;
}


// 工作:
// worksheet.Cells [cellRowIndex,cellColumnIndex] = dataGridView1.Rows [i] .Cells [j]。 Value.ToString();
}
cellColumnIndex ++;
}
cellColumnIndex = 1 ;
cellRowIndex ++;
}

// 获取要保存的Excel的位置和文件名来自用户。
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.Filter = Excel文件(* .xlsx)| * .xlsx |所有文件(*。 。*)| *。*;
saveDialog.FilterIndex = 2 ;

if (saveDialog.ShowDialog()== System.Windows.Forms.DialogResult.OK)
{
workbook.SaveAs(saveDialog.FileName);
MessageBox.Show( Export Successful);
}
}
catch (System.Exception ex)
{
MessageBox.Show(例如信息);
}
最后
{
excel.Quit();
workbook = null ;
excel = null ;
}





我尝试过:



我尝试使用IF / ELSE条件来避免程序进入异常,但没有成功。

解决方案

你的 catch 块没有帮助你 - 你几乎丢弃了异常的所有有用细节,并在抛出异常时阻止Visual Studio中断。



但是在猜测中,异常可能是从这一行抛出的:

 if(dataGridView1.Rows [ i] .Cells [j] .Value.ToString()!= null)



如果 Value null ,当你试图调用 ToString NullReferenceException c> on。



如果价值 null ,然后 ToString 将不会返回 null



删除该行的 .ToString()调用。

 if(dataGridView1.Rows [i] .Cells [j] .Value!= null)
{
worksheet.Cells [cellRowIndex,cellColumnIndex] = dataGridView1.Rows [i] .Cells [j] .Value.ToString();
}
else
{
worksheet.Cells [cellRowIndex,cellColumnIndex] = String.Empty;
}


Is anybody can help me understand the issue of my code? It is always going to the exception, does not matter if I try to "treat" the cell with NULL.

My catch System.Exception error is:
"Object reference not set to an instance of an object"



try
 {

     worksheet = workbook.ActiveSheet;

     worksheet.Name = "ExportedFromDatGrid";

     int cellRowIndex = 1;
     int cellColumnIndex = 1;


     //Loop through each row and read value from each column.
     for (int i = -1; i < dataGridView1.Rows.Count - 1; i++)
     {
         for (int j = 0; j < dataGridView1.Columns.Count; j++)
         {
             // Excel index starts from 1,1. As first Row would have the Column headers, adding a condition check.
             if (cellRowIndex == 1)
             {
                 worksheet.Cells[cellRowIndex, cellColumnIndex] = dataGridView1.Columns[j].HeaderText;
             }
             else
             {

                 if (dataGridView1.Rows[i].Cells[j].Value.ToString() != null)
                 {
                     worksheet.Cells[cellRowIndex, cellColumnIndex] = dataGridView1.Rows[i].Cells[j].Value.ToString();
                 }
                 else
                 {
                     worksheet.Cells[cellRowIndex, cellColumnIndex] = String.Empty;
                 }


                 // working:
                 //worksheet.Cells[cellRowIndex, cellColumnIndex] = dataGridView1.Rows[i].Cells[j].Value.ToString();
             }
             cellColumnIndex++;
         }
         cellColumnIndex = 1;
         cellRowIndex++;
     }

     //Getting the location and file name of the excel to save from user.
     SaveFileDialog saveDialog = new SaveFileDialog();
     saveDialog.Filter = "Excel files (*.xlsx)|*.xlsx|All files (*.*)|*.*";
     saveDialog.FilterIndex = 2;

     if (saveDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
     {
         workbook.SaveAs(saveDialog.FileName);
         MessageBox.Show("Export Successful");
     }
 }
 catch (System.Exception ex)
 {
     MessageBox.Show(ex.Message);
 }
 finally
 {
     excel.Quit();
     workbook = null;
     excel = null;
 }



What I have tried:

I tried, with no success, to use an IF/ELSE condition to avoid the program entering the "exception".

解决方案

Your catch block isn't helping you - you're throwing away almost all of the useful details of the exception, and preventing Visual Studio from breaking when the exception is thrown.

But at a guess, the exception is probably thrown from this line:

if (dataGridView1.Rows[i].Cells[j].Value.ToString() != null)


If the Value is null, you'll get a NullReferenceException when you try to call ToString on it.

If the Value is not null, then ToString will not return null.

Remove the .ToString() call on that line.

if (dataGridView1.Rows[i].Cells[j].Value != null)
{
    worksheet.Cells[cellRowIndex, cellColumnIndex] = dataGridView1.Rows[i].Cells[j].Value.ToString();
}
else
{
    worksheet.Cells[cellRowIndex, cellColumnIndex] = String.Empty;
}


这篇关于datagridview上的异常(nullreferenceexception)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆