我有一个似乎是一个简单的问题,但是它让我试图找出它。
我有一个表单,其中有一个ListView。在这个ListView中,我想用SQL Server 2008数据库表中的数据填充它。
public void LoadList()
{
DataTable dtable = budget_MainDataSetReceipt.Tables["Receipt"];
listView1.Items.Clear();
for (int i = 0; i < dtable.Rows.Count; i++)
{
DataRow drow = dtable.Rows[i];
if (drow.RowState != DataRowState.Deleted)
{
ListViewItem lvi = new ListViewItem(drow["ReceiptID"].ToString());
lvi.SubItems.Add(drow["DateCleared"].ToString());
lvi.SubItems.Add(drow["CategoryID"].ToString());
lvi.SubItems.Add(drow["Amount"].ToString());
lvi.SubItems.Add(drow["Store"].ToString());
lvi.SubItems.Add(drow["DateEntered"].ToString());
listView1.Items.Add(lvi);
}
}
}
我一直在
对象引用未设置为对象的实例
错误,我无法弄清楚原因。我的数据库中有大约5行数据,因此在我看来,列表视图中应该有5行数据。
谁能告诉我我失踪了什么?如果有帮助,我可以发布更多代码。
我尝试过多种方式调用LoadList()
方法:
InitializeComponent()
方法我尝试了以下语法
this.LoadList();
this.Form1.LoadList();`
我还尝试使用以下内容初始化DataTables类型:
DataTables dt = new DataTables //did not work
答案 0 :(得分:2)
我的预感是:你假设你DataRow
中的所有列都存在而不是空 - 这是一个危险的假设。
我会更改您的作业,以便在返回字符串之前使用检查DBNull
的方法:
public string SafeGetString(DataRow row, string columnName)
{
if(row[columnName] != null && row[columnName] != DBNull.Value)
{
return row[ColumName].ToString();
}
return string.Empty;
}
所以你可以看起来像:
ListViewItem lvi = new ListViewItem(SafeGetString(drow, "ReceiptID"));
lvi.SubItems.Add(SafeGetString(drow, "DateCleared"));
// and so forth
这样,如果任何列应包含NULL
,您将返回一个空字符串 - 而不是遇到导致您看到的错误的NULL.ToString()
。