c# - 导出数据时抛出不明原因的 NullReferenceException
问题描述
当我尝试从应用程序中的 datagrid 导出数据时,它只导出 15 行(+ 标题),然后在第 16 行抛出NullReferenceException
. 有几次它成功地导出了 35 行,然后在第 36 行抛出异常,但大多数时候它停在 15 行。有没有人遇到过这种类型的问题?为什么第 16 行会导致此问题?
我正在构建一个 C# WPF 应用程序,用户可以通过单击按钮将数据从数据库读取到 datagrdid 视图。我制作了另一个按钮以将数据从数据网格导出到 Excel 文件,以防用户需要 Excel 中的数据。因为我认为它与内存有关,所以我尝试重新启动 PC 以查看它可以导出多少行,然后通常(并非总是)它导出到第 35 行,然后第二次点击运行它导出只到第 15 行。该表相当大(182 列),因此我尝试使用只有 2 列和 40 行的较小表,并且行为没有变化。这是处理on_click
导出按钮事件的函数。
private void ExportToExcel_Click(object sender, RoutedEventArgs e) { Excel.Application excel = new Excel.Application(); excel.Visible = true; Workbook workbook = excel.Workbooks.Add(System.Reflection.Missing.Value); Worksheet sheet1 = (Worksheet)workbook.Sheets[1]; for (int j = 0; j < DelavciDataGrid.Columns.Count; j++) { Range myRange = (Range)sheet1.Cells[1, j + 1]; sheet1.Cells[1, j + 1].Font.Bold = true; myRange.Value2 = DelavciDataGrid.Columns[j].Header; } for (int i = 1; i < DelavciDataGrid.Items.Count; i++) { for (int j = 0; j < DelavciDataGrid.Columns.Count; j++) { Range myRangee = (Range)sheet1.Cells[i + 1, j + 1]; TextBlock b = DelavciDataGrid.Columns[j].GetCellContent(DelavciDataGrid.Items[i - 1]) as TextBlock; myRangee.Value2 = b.Text; } } }
单击导出按钮后,Excel 将打开,它将数据网格中的标题填充到电子表格中,然后将行和列从 1 行 1 列开始填充,这样就可以了。但随后它到达第 16 行并NullReferenceException
在线抛出
myRangee.Value2 = b.Text;
我尝试使用调试器,确实b.Text
在第 16 行设置为 null,但这让我感到困惑。第 16 行有一个值,正如我所说,我设法使用相同的查询从同一个表中导出了几次到第 35 行。
解决方案
如果您看到空值但该行中的值不为空,我的第一个想法是您的“as”演员是否找到无法转换为文本块并返回空的内容。也许看看如果你创建一个对象类型的“preb”变量和一个从 preb 转换的“B”变量会发生什么,看看 A 是否不为空而 B 是否为空。如果是这种情况,那么您可能需要强制转换为不同的对象或进行“if (b is X)”检查以解决问题。
推荐阅读
- python - 根据某些条件合并python数据框的行数据
- bash - 使用 sed 或 awk 将 .profile 中的一段代码替换为文件
- java - java.lang.module.FindException:找不到模块 javafx.controls
- python - 如何添加不和谐的 ID/用户名
- google-apps-script - 为什么我的日期/时间出现在不同的时区?
- javascript - 如何在嵌套回调和 foreach 循环中停止代码?
- azure - Azure HDInsight Spark 群集 - 异地复制?
- r - R - Dataframe - 使用包含位置和字符列表的两列替换字符串中的字符
- python - 如何使来自多个文件的大数据/代码的所有可能组合。代码超过200、400、1000、20亿
- c++ - C++ 变量模板是内联的吗?