似乎无法修复c#中对象的null情况(对象引用未设置为对象的实例)

本文关键字:对象 对象引用 设置 实例 情况 null | 更新日期: 2023-09-27 18:10:25

我的DataTable对象似乎是空的,但我不明白为什么。我试着给它加三个变量,但它还是说它是空的。下面是我的代码:

    DataTable dt;
    DataSet ds = new DataSet();
    private void InitDataTable()
    {
        if (!File.Exists("gjesteInfo.xml"))
        {
            dt = new DataTable("Gjester");
            ds.ReadXml("gjesteInfo.xml");
            ds.Tables.Add(dt);
            DataColumn dc1 = new DataColumn("Fullt navn");
            DataColumn dc2 = new DataColumn("Start dato");
            DataColumn dc3 = new DataColumn("Antall dager");
            dt.Columns.Add(dc1);
            dt.Columns.Add(dc2);
            dt.Columns.Add(dc3);
            dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text);
            ds.Merge(dt);
            ds.WriteXml("gjesteInfo.xml");  
        }
        else
        {
            dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text);
            ds.Merge(dt); <- This is where I want to add information to the dataTable, and this is where the error shows up.
            ds.WriteXml("gjesteInfo.xml");
        }

    }

有什么建议如何避免著名的"对象引用不设置为对象的实例"错误?

似乎无法修复c#中对象的null情况(对象引用未设置为对象的实例)

在if语句的else部分,DataTable没有初始化
但主要的问题是,如果文件不存在你不能尝试读取它.....

if(!File.Exists("gjesteInfo.xml"))
{
     // The file doesn't exist, create the table to receive initial data here
     dt = new DataTable("Gjester");
     DataColumn dc1 = new DataColumn("Fullt navn");
     DataColumn dc2 = new DataColumn("Start dato");
     DataColumn dc3 = new DataColumn("Antall dager");
     dt.Columns.Add(dc1);
     dt.Columns.Add(dc2);
     dt.Columns.Add(dc3);
     dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text);
     ds.Tables.Add(dt);
}
else
{
    // The file exist, read the data and use the first table in the dataset to add new info
    ds.ReadXml("gjesteInfo.xml");
    dt = ds.Tables[0];
    dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text);
}
ds.Merge(dt);
ds.WriteXml("gjesteInfo.xml");

EDIT查看您下面的评论,似乎您的文本框包含了之前输入的所有数据。如果是这种情况,那么xml文件需要从头开始重写

if(File.Exists("gjesteInfo.xml"))
   File.Delete("gjesteInfo.xml")
dt = new DataTable("Gjester");
DataColumn dc1 = new DataColumn("Fullt navn");
DataColumn dc2 = new DataColumn("Start dato");
DataColumn dc3 = new DataColumn("Antall dager");
dt.Columns.Add(dc1);
dt.Columns.Add(dc2);
dt.Columns.Add(dc3);
dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text);
ds.Tables.Add(dt);
ds.Merge(dt);
ds.WriteXml("gjesteInfo.xml");

如果您遇到else部分-您从未创建dt数据表对象!您只能在if块....中实例化它您需要在 if语句之前有dt = new DataTable()调用,以便它对两种情况都有效....

DataTable dt;
DataSet ds = new DataSet();
private void InitDataTable()
{
    dt = new DataTable("Gjester");  <<=== this **BEFORE** the if!
    if (!File.Exists("gjesteInfo.xml"))
    {
       ....... 
    }
    else
    {
       // now, in this case, "dt" has been created, and **NOW** you can operate on it!
       dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text);
       ds.Merge(dt); 
       ds.WriteXml("gjesteInfo.xml");
    }

应该是:

    else
    {
        dt = new DataTable("Gjester");
        dt.Rows.Add(gjestenavnInput.Text, datoInnsjekk.Text, antallDager.Text);
        ds.Merge(dt);
        ds.WriteXml("gjesteInfo.xml");
    }